Docker撰写环境变量

时间:2020-10-08 12:45:58

标签: docker docker-compose environment-variables dockerfile

我正在尝试将 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用户 -端口(服务器和客户端) -api网址

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

不确定这是否是常见做法。

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

来自documentation

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

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

答案 1 :(得分:-1)

在我看来,在您的环境中,“-”这个符号丢失了。这样吧

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