Docker 没有获取 Postgres 环境变量

ran*_*dal 4 postgresql docker

Docker 正在使用我的 .env 文件中的变量,我不断收到错误消息:

未处理的拒绝 SequelizeConnectionError:角色“eli”不存在

我希望 Postgres 从设置的环境中获取变量 docker-compose.yml

.env

POSTGRES_PORT=5432
POSTGRES_DB=elitest4
POSTGRES_USER=eli
POSTGRES_PASSWORD=
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

# docker-compose.yml
version: "3"
services:
  app:
    build: .
    depends_on:
      - database
    ports:
      - 8000:8000
    environment:
      - POSTGRES_HOST=database
    env_file:
      - .env
  database:
    image: postgres:9.6.8-alpine
    environment: # postgress should be getting these variables, not the variables set in the env file thats for localhost
      POSTGRES_PASSWORD: password
      POSTGRES_USER: user
      POSTGRES_DB: db
    volumes:
      - pgdata:/var/lib/postgresql/pgdata
    ports:
      - 8002:5432
    env_file:
      - .env
  react_client:
      build:
        context: ./client
        dockerfile: Dockerfile
      image: react_client
      working_dir: /home/node/app/client
      volumes:
        - ./:/home/node/app
      ports:
        - 8001:8001
      env_file:
        - ./client/.env
volumes:
  pgdata:
Run Code Online (Sandbox Code Playgroud)

axi*_*sty 5

TL/DR

尝试更新 docker-compose 服务数据库环境部分,如下所示:

environment:
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
  POSTGRES_USER: ${POSTGRES_USER:-user}
  POSTGRES_DB: ${POSTGRES_DB:-db}
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您想查看每个绑定变量最终如何在 Compose 中求值,您可以运行以下命令来查看“有效”撰写文件:

$ docker-compose 配置

此命令将打印出您的撰写文件的外观,其中所有变量替换都替换为其评估。


请参阅Compose 中环境变量和文档中的变量替换部分。

请密切注意此部分:

当您在多个文件中设置相同的环境变量时,Compose 使用以下优先级来选择要使用的值:

1. Compose file 
2. Shell environment variables 
3. Environment file Dockerfile
4. Variable is not defined
Run Code Online (Sandbox Code Playgroud)

在下面的示例中,我们在环境文件和 Compose 文件上设置了相同的环境变量:

$ cat ./Docker/api/api.env
NODE_ENV=test

$ cat docker-compose.yml 
version: '3' 
services:
api:
  image: 'node:6-alpine'
  env_file:
    - ./Docker/api/api.env
  environment:
    - NODE_ENV=production 
Run Code Online (Sandbox Code Playgroud)

运行容器时,Compose 文件中定义的环境变量优先。

$ docker-compose exec api node
process.env.NODE_ENV 'production'
Run Code Online (Sandbox Code Playgroud)

只有当环境或 env_file 没有 Docker Compose 条目时,Dockerfile 中的任何 ARG 或 ENV 设置才会进行评估。

NodeJS 容器的细节

如果您有likepackage.json条目,则这会否决您文件中的任何设置。script:startNODE_ENV=test node server.jsdocker-compose.yml

  • 谢谢,docker-compose 配置非常有用! (2认同)