【问题标题】:Pass environment variable from external env file to container using docker compose使用 docker compose 将环境变量从外部 env 文件传递​​到容器
【发布时间】:2020-03-22 19:16:08
【问题描述】:

我有一个 docker-compose 文件,它有一个运行 postgres 数据库映像的服务。数据库的环境变量(用户、密码、db_name)在一个名为db.env的环境文件中:

DB_USERNAME=some_user
DB_PASSWORD=thepassword
DB_NAME=database

因为我只想将这些变量放在一个文件中,所以我想使用这个backand/db.env 文件。问题是,环境变量名称与 postgres 使用的变量名称不同(DB_USERNAME POSTGRES_USER)。

这是docker-compose.yml 文件:

services:
  db:
    image: postgres
    ports:
      - 5432:5432
    env_file: 
      - backend/db.env
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_USER=${DB_TEST}
      - POSTGRES_DB=${DB_DATABASE}

我尝试使用与使用标准 .env 文件时相同的方法:Environment variables in Compose

【问题讨论】:

  • 所以除了默认的 .env 文件之外,没有可能使用 .env 文件(此处为 backend/db.env)中的变量?
  • 当然你可以使用 db.env 但 ENV 名称应该与 postgress 环境变量匹配。

标签: docker docker-compose environment-variables


【解决方案1】:

env_file 将在撰写文件本身的容器.env 中可用,因此您需要在此处使用.env

解决方法:

for i in $(cat < db.env); do export $i;done && docker-compose up -d

db.env:

DB_USERNAME=some_user
DB_PASSWORD=thepassword
DB_NAME=database

【讨论】:

    【解决方案2】:

    为什么在 db.env 中定义后又重新定义环境变量?您可以使用相同的db.env。只需根据Postgres环境变量名在db.env中设置环境变量名,即可here

    db.env

    POSTGRES_PASSWORD=pass
    POSTGRES_USER=user
    POSTGRES_DB=db
    

    和码头工人撰写

    services:
      db:
        image: postgres
        ports:
          - 3306:3306
        env_file: 
          - db.env
    

    docker-compose up然后尝试验证数据库和用户

    docker exec -it <container_id> bash -c "psql -U user -l"
    
    

    输出

    docker-user$  docker exec -it postgress-env_db_1 bash -c "psql -U user -l"
                                 List of databases
       Name    | Owner | Encoding |  Collate   |   Ctype    | Access privileges 
    -----------+-------+----------+------------+------------+-------------------
     db        | user  | UTF8     | en_US.utf8 | en_US.utf8 | 
     postgres  | user  | UTF8     | en_US.utf8 | en_US.utf8 | 
     template0 | user  | UTF8     | en_US.utf8 | en_US.utf8 | =c/user          +
               |       |          |            |            | user=CTc/user
     template1 | user  | UTF8     | en_US.utf8 | en_US.utf8 | =c/user          +
               |       |          |            |            | user=CTc/user
    (4 rows)
    
    

    或者如果你想要相同的环境,那么你可以像这样传递

    (export $(cat db.env | xargs) && docker-compose up )
    
    

    【讨论】:

    • 我之所以没有这样做,是因为我想保留 db.env 文件的当前格式。但是,是的,可以选择改变这一点,谢谢。
    • @Adiii cat db.env | docker-compose up 将不起作用,您将始终收到 WARNING: The DB_PASSWORD variable is not set. Defaulting to a blank string
    猜你喜欢
    • 2020-02-23
    • 2017-09-18
    • 2020-06-09
    • 2018-02-11
    • 2020-12-17
    • 2017-06-04
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多