Docker Compose 中环境变量的优先级
当同一环境变量在多个来源中设置时,Docker Compose 会遵循优先级规则来确定该变量在容器环境中的值。
本页面包含有关设置环境变量的各种方法的优先级顺序的信息。
优先级顺序(从高到低)如下:
- 通过
docker compose run -e在命令行界面(CLI)中设置。 - 使用
environment或env_file属性进行设置,但其值需从您的 shell 或环境文件中插值获取。(可以是您的默认.env文件,或在命令行界面中使用--env-file参数)。 - 只需在 Compose 文件中设置
environment属性。 - 在 Compose 文件中使⽤
env_file属性。 - 在容器镜像的
ENV 指令中设置。
只有当
environment、env_file或run --env没有 Docker Compose 条目时,Dockerfile中的任何ARG或ENV设置才会生效。
简单示例
在以下示例中,同一个环境变量在 .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 标志,以从环境中复制值。主机操作系统的值具有优先级,并会被复制到容器的环境中。
结果 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 标志的优先级高于 environment 和 env_file 属性,其设置为从本地环境复制 VALUE。主机操作系统的值具有更高优先级,并会被复制到容器的环境中。
结果 13 到 15:--env 标志的优先级高于 environment 和 env_file 属性,因此会设置该值。