Docker Compose env文件优先级高于未定义的shell过程变量

Docker Compose env文件优先级高于未定义的shell过程变量,docker,docker-compose,Docker,Docker Compose,当我在docker compose.yml中使用environment键(不给它们赋值)并使用env_file键定义相同的环境变量时,第一个变量优先,即使它没有在shell中定义 我正在使用docker compose版本1.23.1,构建b02f1306 在报告中说: 在多个文件中设置相同的环境变量时,以下是Compose用于选择要使用的值的优先级: 撰写文件 Shell环境变量 环境文件 Dockerfile 未定义变量 我假设如果在shell中没有定义变量(第5点),那么它就没有优先于在环

当我在
docker compose.yml
中使用
environment
键(不给它们赋值)并使用
env_file
键定义相同的环境变量时,第一个变量优先,即使它没有在shell中定义

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

在报告中说:

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

  • 撰写文件
  • Shell环境变量
  • 环境文件
  • Dockerfile
  • 未定义变量
  • 我假设如果在shell中没有定义变量(第5点),那么它就没有优先于在环境文件中定义的变量

    docker compose.yml

    version: '3'
    services:
      db:
        image: "postgres:11-alpine"
        environment:
          - POSTGRES_USER
          - POSTGRES_PASSWORD
        env_file: "db-variables.env"
    
    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
    
    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
    
    $ 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
    
    我希望shell传递的环境变量
    environment
    只有在shell中真正定义时才优先于
    env_file
    变量


    我是否误解了文档?是否有解决办法?

    如文件中所述:

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

    定义要查看的变量,因为我认为值未设置为变量

    docker compose.yml

    version: '3'
    services:
      db:
        image: "postgres:11-alpine"
        environment:
          - POSTGRES_USER
          - POSTGRES_PASSWORD
        env_file: "db-variables.env"
    
    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
    
    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
    
    $ 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
    

    如文件所述:

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

    定义要查看的变量,因为我认为值未设置为变量

    docker compose.yml

    version: '3'
    services:
      db:
        image: "postgres:11-alpine"
        environment:
          - POSTGRES_USER
          - POSTGRES_PASSWORD
        env_file: "db-variables.env"
    
    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
    
    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
    
    $ 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
    

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

    在Environment部分中声明的环境变量将覆盖这些值,即使这些值为空或未定义,该值仍然有效


    RTFM到我自己。

    在文档的另一部分中,我找到了环境变量:

    在Environment部分中声明的环境变量将覆盖这些值,即使这些值为空或未定义,该值仍然有效


    RTFM给我自己。

    我知道如果你给它们赋值,优先权会被赋予那些在组合中定义的值,我的问题是如何做到这一点,如果你没有在组合中赋值,优先权会被赋予在环境文件中定义的值。我知道如果你给它们赋值,优先权会被赋予那些在组合中定义的值,我的问题是如何做到这一点,如果不在compose中赋值,则取env_文件中定义的值。