Docker Compose 中的环境变量优先级

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

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

优先级顺序(从最高到最低)如下

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

简单示例

在以下示例中,.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 代入值。

Host OS environment.env 文件列仅用于说明目的。实际上,它们本身不会导致容器中的变量,而是在 environmentenv_file 属性的配合下才会导致容器中的变量。

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

#docker compose runenvironment 属性env_file 属性镜像 ENVHost OS 环境.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 标志设置,该标志设置为复制来自环境的值。Host OS 值优先,并复制到容器的环境中。

结果 7:docker compose run 命令具有 --env 标志设置,该标志设置为复制来自环境的值。.env 文件中的值被选中以定义容器的环境。

结果 8:Compose 文件中的 env_file 属性设置为从本地环境复制 VALUE。Host OS 值优先,并复制到容器的环境中。

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

结果 10:Compose 文件中的 environment 属性设置为从本地环境复制 VALUE。Host OS 值优先,并复制到容器的环境中。

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

结果 12:--env 标志比 environmentenv_file 属性具有更高的优先级,因此设置为从本地环境复制 VALUE。Host OS 值优先,并复制到容器的环境中。

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