Docker Compose 中的环境变量优先级
当在多个源中设置相同的环境变量时,Docker Compose 会遵循优先规则来确定该变量的值。
此页面包含有关设置环境变量的每种方法所采用的优先级的信息。
优先级顺序(从最高到最低)如下:
- 在 CLI 中设置使用
docker compose run -e
- 从你的外壳中替换
- 仅使用
environment
Compose 文件中的属性进行设置 - 在 CLI 中使用
--env-file
参数 - 在 Compose 文件中使用该
env_file
属性 - 使用
位于项目目录底部的
.env
文件进行设置 - 在ENV 指令中的容器映像中设置
。仅当 ,或没有 Docker Compose 条目时, a 中包含任何
ARG
或ENV
设置才会进行评估。Dockerfile
environment
env_file
run --env
简单的例子
在下面的示例中,我们为文件中的同一环境变量.env
以及environment
Compose 文件中的属性设置不同的值:
$ 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=test
node server.js
设置的任何值在容器内运行时都会被忽略。NODE_ENV
npm 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 |