Docker Compose 中的环境变量优先级
当在多个来源中设置了相同的环境变量时,Docker Compose 会遵循优先级规则来确定容器环境中该变量的值。
此页面包含有关设置环境变量的每种方法的优先级级别信息。
优先级顺序(从最高到最低)如下
- 使用
docker compose run -e
在 CLI 中设置. - 使用
environment
或env_file
属性设置,但值从您的 shell 或环境文件进行插值。(无论是您的默认.env
文件,还是使用--env-file
参数 在 CLI 中进行插值)。 - 仅使用
environment
属性 在 Compose 文件中设置。 - 在 Compose 文件中使用
env_file
属性。 - 在容器镜像中使用 ENV 指令 设置。如果
environment
、env_file
或run --env
没有 Docker Compose 条目,则Dockerfile
中的任何ARG
或ENV
设置仅在没有 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
文件列仅用于说明目的。实际上,它们本身不会导致容器中的变量,而是在 environment
或 env_file
属性的配合下才会导致容器中的变量。
每行代表 VALUE
设置、代入或同时进行的上下文的组合。结果列指示每种情况下 VALUE
的最终值。
# | docker compose run | environment 属性 | env_file 属性 | 镜像 ENV | Host OS 环境 | .env 文件 | 结果 | |
---|---|---|---|---|---|---|---|---|
1 | - | - | - | - | VALUE=1.4 | VALUE=1.3 | - | |
2 | - | - | VALUE=1.6 | VALUE=1.5 | VALUE=1.4 | - | VALUE=1.6 | |
3 | - | VALUE=1.7 | - | VALUE=1.5 | VALUE=1.4 | - | VALUE=1.7 | |
4 | - | - | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.5 | |
5 | --env VALUE=1.8 | - | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 | |
6 | --env VALUE | - | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 | |
7 | --env VALUE | - | - | VALUE=1.5 | - | VALUE=1.3 | VALUE=1.3 | |
8 | - | - | VALUE | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 | |
9 | - | - | VALUE | VALUE=1.5 | - | VALUE=1.3 | VALUE=1.3 | |
10 | - | VALUE | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 | |
11 | - | VALUE | - | VALUE=1.5 | - | VALUE=1.3 | VALUE=1.3 | |
12 | --env VALUE | VALUE=1.7 | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.4 | |
13 | --env VALUE=1.8 | VALUE=1.7 | - | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 | |
14 | --env VALUE=1.8 | - | VALUE=1.6 | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=1.8 | |
15 | --env VALUE=1.8 | VALUE=1.7 | VALUE=1.6 | VALUE=1.5 | VALUE=1.4 | VALUE=1.3 | VALUE=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
标志比 environment
和 env_file
属性具有更高的优先级,因此设置为从本地环境复制 VALUE
。Host OS 值优先,并复制到容器的环境中。
结果 13 到 15:--env
标志比 environment
和 env_file
属性具有更高的优先级,因此设置了值。