未定义时,Docker Compose env文件优先于shell传递变量

时间:2019-06-12 23:13:23

标签: docker docker-compose

当我使用docker-compose.yml键(不给它们提供值)并使用environment键在env_file中定义相同的环境变量时,即使不是在外壳中定义。

我正在使用docker-compose版本1.23.1,构建b02f1306

documentation中说:

  

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

     
      
  1. 撰写文件
  2.   
  3. Shell环境变量
  4.   
  5. 环境文件
  6.   
  7. Dockerfile
  8.   
  9. 未定义变量
  10.   

我假设,如果在外壳程序中未定义变量(第5点),则它没有环境文件中定义的变量优先。

docker-compose.yml

version: '3'
services:
  db:
    image: "postgres:11-alpine"
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
    env_file: "db-variables.env"

db-variables.env

POSTGRES_USER=bob
POSTGRES_PASSWORD=password

结果:

$ docker-compose run --entrypoint printenv db
Creating network "compose-example_default" with the default driver
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=105881c75c8c
TERM=xterm
LANG=en_US.utf8
PG_MAJOR=11
PG_VERSION=11.1
PG_SHA256=90815e812874831e9a4bf6e1136bf73bc2c5a0464ef142e2dfea40cda206db08
PGDATA=/var/lib/postgresql/data
HOME=/root

我希望Shell传递环境变量environment仅在env_file变量中真正定义时才具有优先级。

我误解了文档吗?有什么解决方法吗?

2 个答案:

答案 0 :(得分:1)

如文档中所述:

  

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

定义变量以查看,因为我认为未将值设置为变量。

docker-compose.yml

version: '3'
services:
  db:
    image: "postgres:11-alpine"
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    env_file: "db-variables.env"

db-variables.env

POSTGRES_USER=bob
POSTGRES_PASSWORD=password

结果:

$ docker-compose run --entrypoint printenv db
Creating network "compose-example_default" with the default driver
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8fcbf617bb6d
TERM=xterm
POSTGRES_USER=user
POSTGRES_PASSWORD=password
LANG=en_US.utf8
PG_MAJOR=11
PG_VERSION=11.3
PG_SHA256=2a85e082fc225944821dfd23990e32dfcd2284c19060864b0ad4ca537d30522d
PGDATA=/var/lib/postgresql/data
HOME=/root

答案 1 :(得分:0)

在有关环境变量的文档的另一部分中,我发现this

  在环境部分中声明的

环境变量会覆盖这些值,即使这些值是空的或未定义的,该参数也保持为真。

对我来说是RTFM。