Docker Compose中的环境变量优先级

当在多个来源中设置相同的环境变量时,Docker Compose 会遵循优先级规则来确定容器环境中该变量的值。

此页面包含有关设置环境变量的每种方法的优先级级别信息。

优先级顺序(从高到低)如下所示:

  1. 使用 CLI 中的docker compose run -e 设置。
  2. 使用environmentenv_file属性设置,但值从您的shell或环境文件(您的默认.env文件,或使用CLI中的--env-file参数)进行插值。
  3. 仅使用Compose文件中的environment属性设置。
  4. 在Compose文件使用env_file属性
  5. ENV指令中,在容器镜像中设置。只有在没有environmentenv_filerun --env的Docker Compose条目时,Dockerfile中的任何ARGENV设置才会进行评估。

简单示例

在以下示例中,.env文件和Compose文件中的environment属性中,同一环境变量具有不同的值。

$ cat ./webapp.env
NODE_ENV=test

$ cat compose.yml
services:
  webapp:
    image: 'webapp'
    env_file:
     - ./webapp.env
    environment:
     - NODE_ENV=production

使用environment属性定义的环境变量具有优先级。

$ docker compose run webapp env | grep NODE_ENV
NODE_ENV=production

高级示例

下表使用定义镜像版本的VALUE环境变量作为示例。

表格工作原理

每一列代表您可以设置值或为VALUE替换值的上下文。

仅出于说明目的列出了主机操作系统环境.env文件列。实际上,它们本身不会在容器中生成变量,而是与environmentenv_file属性结合使用。

每一行代表设置、替换或同时设置VALUE的上下文的组合。**结果**列指示每种情况下VALUE的最终值。

#docker compose runenvironment属性env_file属性镜像ENV主机操作系统环境.env文件结果
1----VALUE=1.4VALUE=1.3-
2--VALUE=1.6VALUE=1.5VALUE=1.4-VALUE=1.6
3-VALUE=1.7-VALUE=1.5VALUE=1.4-VALUE=1.7
4---VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.5
5--env VALUE=1.8--VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8
6--env VALUE--VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
7--env VALUE--VALUE=1.5-VALUE=1.3VALUE=1.3
8--VALUEVALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
9--VALUEVALUE=1.5-VALUE=1.3VALUE=1.3
10-VALUE-VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
11-VALUE-VALUE=1.5-VALUE=1.3VALUE=1.3
12--env VALUEVALUE=1.7-VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.4
13--env VALUE=1.8VALUE=1.7-VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8
14--env VALUE=1.8-VALUE=1.6VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8
15--env VALUE=1.8VALUE=1.7VALUE=1.6VALUE=1.5VALUE=1.4VALUE=1.3VALUE=1.8

结果说明

结果1:本地环境优先,但Compose文件未设置为在容器内复制此环境,因此未设置此类变量。

结果2:Compose文件中的env_file属性为VALUE定义了显式值,因此容器环境将相应设置。

结果3:Compose文件中的environment属性为VALUE定义了显式值,因此容器环境将相应设置。

结果4:镜像的ENV指令声明了变量VALUE,并且由于Compose文件未设置为覆盖此值,因此此变量由镜像定义。

结果5:docker compose run命令设置了--env标志,该标志具有显式值,并覆盖了镜像设置的值。

结果6:docker compose run命令设置了--env标志以复制环境中的值。主机操作系统值优先并复制到容器的环境中。

结果7:docker compose run命令设置了--env标志以复制环境中的值。选择.env文件中的值来定义容器的环境。

结果8:Compose文件中的env_file属性设置为从本地环境复制VALUE。主机操作系统值优先并复制到容器的环境中。

结果9:Compose文件中的env_file属性设置为从本地环境复制VALUE。选择.env文件中的值来定义容器的环境。

结果10:Compose文件中的environment属性设置为从本地环境复制VALUE。主机操作系统值优先并复制到容器的环境中。

结果11:Compose文件中的environment属性设置为从本地环境复制VALUE。选择.env文件中的值来定义容器的环境。

结果12:--env标志比environmentenv_file属性具有更高的优先级,并设置为从本地环境复制VALUE。主机操作系统值优先并复制到容器的环境中。

结果13到15:--env标志比environmentenv_file属性具有更高的优先级,因此设置了该值。