Docker Compose 中的环境变量优先级
当在多个源中设置相同的环境变量时,Docker Compose 会遵循优先规则来确定该变量的值。
此页面包含有关设置环境变量的每种方法所采用的优先级的信息。
优先级顺序(从最高到最低)如下:
- 在 CLI 中设置使用
docker compose run -e - 从你的外壳中替换
- 仅使用
environmentCompose 文件中的属性进行设置 - 在 CLI 中使用
--env-file参数 - 在 Compose 文件中使用该
env_file属性 - 使用
位于项目目录底部的
.env文件进行设置 - 在ENV 指令中的容器映像中设置
。仅当 ,或没有 Docker Compose 条目时, a 中包含任何
ARG或ENV设置才会进行评估。Dockerfileenvironmentenv_filerun --env
简单的例子
在下面的示例中,我们为文件中的同一环境变量.env以及environmentCompose 文件中的属性设置不同的值:
$ cat ./Docker/api/api.env
NODE_ENV=test
$ cat compose.yml
services:
api:
image: 'node:6-alpine'
env_file:
- ./Docker/api/api.env
environment:
- NODE_ENV=production
使用该属性定义的环境变量environment优先。
$ docker compose exec api node
> process.env.NODE_ENV
'production'
容器脚本中的硬编码变量
在容器内执行无条件设置变量值的命令会否决
compose.yml文件中的任何设置。例如,在 NodeJS 项目中,如果您有 的
package.json条目(scripts.start例如 ),则在您的 Compose 文件中NODE_ENV=testnode server.js设置的任何值在容器内运行时都会被忽略。NODE_ENVnpm run start
高级示例
下表TAG以定义镜像版本的环境变量 为例。
该表的工作原理
每列代表一个上下文,您可以在其中设置值或替换 的值TAG。
列Host OS environment和.env file仅作为示例查找而列出。实际上,它们本身不会在容器中产生变量。
TAG每行代表设置、替换或两者的上下文组合。结果列TAG指示每个场景的最终值。
| # | docker compose run --env | environment属性 | env_file属性 | 图像ENV | Host OS环境 | .env文件 | 结果 | |
|---|---|---|---|---|---|---|---|---|
| 1 | - | - | - | - | TAG=1.4 | TAG=1.3 | - | |
| 2 | - | - | - | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.5 | |
| 3 | TAG | - | - | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.4 | |
| 4 | - | - | TAG | TAG=1.5 | - | TAG=1.3 | TAG=1.3 | |
| 5 | TAG | - | - | TAG=1.5 | - | TAG=1.3 | TAG=1.3 | |
| 6 | TAG=1.8 | - | - | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.8 | |
| 7 | - | TAG | - | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.4 | |
| 8 | TAG | TAG=1.7 | - | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.4 | |
| 9 | TAG=1.8 | TAG=1.7 | - | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.8 | |
| 10 | TAG=1.8 | - | TAG=1.6 | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.8 | |
| 11 | TAG=1.8 | TAG=1.7 | TAG=1.6 | TAG=1.5 | TAG=1.4 | TAG=1.3 | TAG=1.8 | |
| 12 | - | - | TAG=1.6 | TAG=1.5 | TAG=1.4 | - | TAG=1.6 | |
| 13 | - | TAG=1.7 | - | TAG=1.5 | TAG=1.4 | - | TAG=1.7 |