Docker Compose 中的环境变量优先级
当同一个环境变量在多个来源中设置时,Docker Compose 会遵循优先级规则来确定该变量在容器环境中的最终值。
本页面包含关于每种设置环境变量的方法所拥有的优先级级别的信息。
优先级顺序(从高到低)如下:
- 在 CLI 中使用
docker compose run -e
设置。 - 使用
environment
或env_file
属性设置,但其值通过你的 shell 或环境变量文件(你的默认.env
文件,或 CLI 中的--env-file
参数)进行插值。 - 仅使用 Compose 文件中的
environment
属性设置。 - 使用 Compose 文件中的
env_file
属性。 - 在容器镜像的
ENV
指令中设置。Dockerfile 中的任何ARG
或ENV
设置仅在 Compose 文件中没有针对environment
、env_file
或run --env
的条目时才会被评估。
简单示例
在下面的示例中,同一个环境变量在 .env
文件和 Compose 文件中的 environment
属性中设置了不同的值
$ cat ./webapp.env
NODE_ENV=test
$ cat compose.yaml
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
在每种情况下的最终值。
# |
| environment 属性 | env_file 属性 | 镜像 ENV | Host OS 环境变量 | .env 文件 | 结果 | |
---|---|---|---|---|---|---|---|---|
1 | - | - | - | - |
|
| - | |
2 | - | - |
|
|
| - |
| |
3 | - |
| - |
|
| - |
| |
4 | - | - | - |
|
|
|
| |
5 |
| - | - |
|
|
|
| |
6 |
| - | - |
|
|
|
| |
7 |
| - | - |
| - |
|
| |
8 | - | - |
|
|
|
|
| |
9 | - | - |
|
| - |
|
| |
10 | - |
| - |
|
|
|
| |
11 | - |
| - |
| - |
|
| |
12 |
|
| - |
|
|
|
| |
13 |
|
| - |
|
|
|
| |
14 |
| - |
|
|
|
|
| |
15 |
|
|
|
|
|
|
|
结果解释
结果 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
属性,因此设置了该值。