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
属性具有更高的优先级,因此设置了该值。