Docker Compose 中的环境变量优先级

当在多个源中设置相同的环境变量时,Docker Compose 会遵循优先规则来确定该变量的值。

此页面包含有关设置环境变量的每种方法所采用的优先级的信息。

优先级顺序(从最高到最低)如下:

  1. 在 CLI 中设置使用 docker compose run -e
  2. 从你的外壳中替换
  3. 仅使用 environmentCompose 文件中的属性进行设置
  4. 在 CLI 中使用 --env-file参数
  5. 在 Compose 文件中使用该 env_file属性
  6. 使用 位于项目目录底部的.env文件进行设置
  7. 在ENV 指令中的容器映像中设置 。仅当 ,或没有 Docker Compose 条目时, a 中包含任何ARGENV设置才会进行评估。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=test node server.js设置的任何值在容器内运行时都会被忽略。NODE_ENVnpm run start

高级示例

下表TAG以定义镜像版本的环境变量 为例。

该表的工作原理

每列代表一个上下文,您可以在其中设置值或替换 的值TAG

Host OS environment.env file仅作为示例查找而列出。实际上,它们本身不会在容器中产生变量。

TAG每行代表设置、替换或两者的上下文组合。结果TAG指示每个场景的最终值。

#docker compose run --envenvironment属性env_file属性图像ENVHost OS环境.env文件结果
1----TAG=1.4TAG=1.3-
2---TAG=1.5TAG=1.4TAG=1.3TAG=1.5
3TAG--TAG=1.5TAG=1.4TAG=1.3TAG=1.4
4--TAGTAG=1.5-TAG=1.3TAG=1.3
5TAG--TAG=1.5-TAG=1.3TAG=1.3
6TAG=1.8--TAG=1.5TAG=1.4TAG=1.3TAG=1.8
7-TAG-TAG=1.5TAG=1.4TAG=1.3TAG=1.4
8TAGTAG=1.7-TAG=1.5TAG=1.4TAG=1.3TAG=1.4
9TAG=1.8TAG=1.7-TAG=1.5TAG=1.4TAG=1.3TAG=1.8
10TAG=1.8-TAG=1.6TAG=1.5TAG=1.4TAG=1.3TAG=1.8
11TAG=1.8TAG=1.7TAG=1.6TAG=1.5TAG=1.4TAG=1.3TAG=1.8
12--TAG=1.6TAG=1.5TAG=1.4-TAG=1.6
13-TAG=1.7-TAG=1.5TAG=1.4-TAG=1.7