使用docker compose将环境变量从外部环境文件传递到容器

时间:2019-11-27 09:14:41

标签: docker docker-compose environment-variables

我有一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

为什么在db.env中定义后再次定义环境变量?您可以使用相同的db.env。只需根据Postgres环境变量名称在db.env中设置环境变量名称,就可以优化here

db.env

POSTGRES_PASSWORD=pass
POSTGRES_USER=user
POSTGRES_DB=db

和Docker组成

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 )