Docker化游戏框架

Dockerizing play framework

我的 docker 撰写文件是:

version: '3'
services:
  postgres:
    container_name: crm-psql
    image: postgres:9.3
    restart: always
    environment:
    - POSTGRES_DB=crm
    - POSTGRES_USER=root
    - POSTGRES_PASSWORD=root
    volumes:
    - ./db/postgres/data:/var/lib/postgresql/data
    ports:
      - 5432:5432
  nginx:
    container_name: crm-nginx
    image: nginx:1.15
    restart: always
    ports:
    - 80:80
    - 443:443
    volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  web:
    build: .
    ports:
    - 9000:9000
    volumes:
    - .:/src/main/java
    - ~/.ivy2:/root/.ivy2
    - ~/.sbt:/root/.sbt
    links:
    - postgres
    - nginx

构建的 docker 文件是:

FROM openjdk:8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin

ENV SBT_VERSION 1.2.1

# Install curl
RUN \
  apt-get update && \
  apt-get -y install curl && \
  apt-get -y install vim

# Install sbt
RUN \
  curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \
  dpkg -i sbt-$SBT_VERSION.deb && \
  rm sbt-$SBT_VERSION.deb && \
  apt-get update && \
  apt-get -y install sbt

WORKDIR /src/main/java
COPY . /src/main/java
RUN sbt update
EXPOSE 9000
ENTRYPOINT ["sbt", "run"]

每当我执行 docker-compose up 时,都不会与 postgres 建立连接。例外是

org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

然而,当我在容器 crm-psql 中执行并键入 psql crm 时,它会进入 postgres shell。这里有什么问题

我认为你的问题是你使用本地主机来指示你的数据库。您应该改用 link。从您的 "sbt" 容器的角度来看,localhost 本身就是您的本地计算机(具有端口转发)或您的 postgresql 容器。

一般我用的是环境变量

links:
  - postgres
  - nginx
environment: 
  - POSTGRES_SERVICE_HOST=postgres

在您需要在 SBT 脚本中指定如何使用您的 POSTGRES_SERVICE_HOST 变量之后