【问题标题】:Docker compose environment variablesDocker 编写环境变量
【发布时间】:2021-01-23 12:29:13
【问题描述】:

我正在尝试容器化 demo nodejs + reactjs + postgresql 应用程序,目录结构如下所示:

demo:
  -client
    -.env
    - Dockerfile.client
    - package.json
  -server
    - .env
    - Dockerfile.server
    - package.json
  .env
  docker-compose.yml

docker-compose.yml

version: '3.8'

services:
  client:
    container_name: ${APP_NAME}_fe
    build:
      dockerfile: ./client/Dockerfile.client
    environment:
      CHOKIDAR_USEPOLLING: "true"
    image: ${APP_NAME}_img_fe
    volumes:
      - ./client:/app
      - /app/node_modules
    ports:
      - 3000:3000

  server:
    container_name: ${APP_NAME}_be
    build:
      # context: .
      dockerfile: ./server/Dockerfile.server
    image: ${APP_NAME}_img_be
    volumes:
      - ./server:/app
      - /app/node_modules
    ports:
      - 5000:5000

  db:
    container_name: ${APP_NAME}_db
    image: postgres
    build:
      # context: .
      dockerfile: ./server/Dockerfile.db
    env_file: ./server/.env
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_DB: ${APP_NAME}
    volumes:
    - db-data:/var/lib/postgresql/data
    ports:
      - 5432:5432
      
volumes:
  db-data:
    name: ${APP_NAME}_db

我正在尝试将所有敏感数据(如密码和密钥)、api url 或端口保存在 .env 文件中,以便我将所有信息集中在一个地方,如下所示:

来自服务器的.env

PORT=5000
DB_PASSWORD=postgres
DB_USER=postgres
DB_NAME=demo

.env 在根级别

APP_NAME=demo

问题在于数据库服务(postgres 容器)的凭据在创建时不可见,所以我需要像这样对它们进行硬编码:

environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: demo

有没有办法从 .env 文件中获取这些值?

LE:我认为一种方法是在应用程序的根目录中只保留一个 .env: -db 密码 -db 用户 -port(服务器和客户端) -api 网址

在这种情况下,我需要从客户端和服务器文件夹中访问 .env。

不确定这是不是一种常见的做法。

谢谢。

【问题讨论】:

    标签: docker docker-compose environment-variables dockerfile


    【解决方案1】:

    您不需要从您的应用程序中访问 .env 文件。您只需在正确的文件夹中运行 docker-compose up 即可替换 docker-compose.yml 解析上下文中的变量。

    您遇到的问题可能是因为您有多个 .env 文件分布在您的项目中,具有不同的值。

    来自documentation

    如果您有多个环境变量,您可以通过提供环境变量文件的路径来替换它们。 默认情况下,docker-compose 命令将在您运行命令的目录中查找名为.env 的文件。 通过将该文件作为参数传递,您可以将其存储在任何地方并适当命名,例如,.env.ci、.env.dev、.env.prod。使用 --env-file 选项传递文件路径:

    这意味着不仅保留 .env 文件是一种好习惯,而且您可能应该只保留一个 .env 文件并从保存该文件的文件夹(通常是项目根文件夹)运行 docker-compose up 命令)。

    【讨论】:

    • 我忘了补充一点,我所在的团队有些同事不使用 docker,并且来自服务器的 ormconfig.json 具有类似的数据库凭据:process.env.DB_PASSWORD。在这种情况下,我需要从 .env 获取密码
    • 保留一个 .env 文件以便进程和 docker-compose 导入不可行吗?
    【解决方案2】:

    在我看来,在您的环境中,缺少“-”这个符号。所以会是

    environment:
        - POSTGRES_PASSWORD: ${DB_PASSWORD}
        - POSTGRES_USER: ${DB_USER}
        - POSTGRES_DB: ${APP_NAME}
    

    并将 docker-compose.yaml 和 .env 文件放在同一目录下尝试

    docker-compose up -d

    我总是使用 -d 作为后台作业、守护线程启动。

    您还可以在此链接查看 Postgres 的环境变量列表:

    https://hub.docker.com/_/postgres

    【讨论】:

    • docker-compose 接受字典和字符串列表作为其环境变量。另外,我认为你错过了 OP 的观点
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2017-09-12
    • 2020-12-07
    • 2018-10-25
    • 2015-06-17
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多