Docker Compose中的环境变量优先级
当在多个来源中设置相同的环境变量时,Docker Compose 会遵循优先级规则来确定容器环境中该变量的值。
此页面包含有关设置环境变量的每种方法的优先级级别信息。
优先级顺序(从高到低)如下所示:
- 使用 CLI 中的
docker compose run -e设置。 - 使用
environment或env_file属性设置,但值从您的shell或环境文件(您的默认.env文件,或使用CLI中的--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替换值的上下文。
仅出于说明目的列出了主机操作系统环境和.env文件列。实际上,它们本身不会在容器中生成变量,而是与environment或env_file属性结合使用。
每一行代表设置、替换或同时设置VALUE的上下文的组合。**结果**列指示每种情况下VALUE的最终值。
| # | docker compose run | environment属性 | env_file属性 | 镜像ENV | 主机操作系统环境 | .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属性具有更高的优先级,因此设置了该值。