Docker Compose中,有很多地方都涉及到环境变量的处理。本文档将协助您了解相关的处理细节。

Compose文件中的环境变量替换

您可以在Compose配置文件中,使用来自执行时的环境变量。这些变量将在Compose解析配置时,自动替换,比如:

web:
  image: "webapp:${TAG}"

该配置中的TAG就将在执行Compose时,从环境变量中获取,并替换掉Compose文件中的${TAG}部分。替换的具体规则可以参见 Docker Compose file 文档中的相关章节

在容器中设置环境变量

你也可以在Compose的service容器配置中,通过environment字段设置环境变量,就像你直接执行docker run -e VARIABLE=VALUE ...时设置的一样。例如:

web:
  environment:
    - DEBUG=1

传递外部环境变量给容器

你也可以从Shell中直接传递环境变量给Compose的service容器,具体的使用方法就是像前面说的在容器中设置环境变量一样,但是指定的环境变量不设置值,这种方式等效于直接执行docker run -e VARIABLE ...。例如:

web:
  environment:
    - DEBUG

DEBUG变量在配置文件中并没有设置值。在容器中它的值取决于执行Compose时Shell环境中的对应环境变量的值。

env_file配置选项

You can pass multiple environment variables from an external file through to a service’s containers with the ‘env_file’ option, just like with docker run --env-file=FILE ...:

你可以通过一个外部文件来设置多个环境变量值,然后通过env_file配置来设置该文件。他等效于直接执行docker run --env-file=FILE ...。例如:

web:
  env_file:
    - web-variables.env

执行docker-compose run时设置

docker run -e类似,你也可以通过docker-compose run -e设置一次性的环境变量。例如:

docker-compose run -e DEBUG=1 web python console.py

同样的,你可以不设置变量的值,使之自动从当前Shell环境中获取:

docker-compose run -e DEBUG web python console.py

.env文件

你可以在名为.envenvironment file文件中,设置Compose文件中引用的任何变量的默认值。比如: named .env:

$ cat .env
TAG=v1.5

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"

当你执行docker-compose up时,这里定义的web服务的image就是webapp:v1.5。你可以通过 Compose的config命令来验证这一点。输出类似下面一样:

$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v1.5'

从执行命令的Shell中得到的值,优先级比从.env文件中设置的要高。所以如果你在Shell中设置了不同于.env文件中的值,那么经过变量替换后得到的image值就会是SHELL中设置的值。比如:

$ export TAG=v2.0
$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v2.0'

当你在多个环境变量相关的文件中,都设置了同样的环境变量时,其优先顺序从高到低是:

  1. Compose文件(默认为docker-compose.yml),
  2. 通过env_file指定的环境变量文件,
  3. Dockerfile
  4. 未定义

在下面这个例子里,我们在环境变量文件、Compose文件中都设置了同样的环境变量:

$ cat ./Docker/api/api.env
NODE_ENV=test

$ cat docker-compose.yml
version: '3'
services:
  api:
    image: 'node:6-alpine'
    env_file:
     - ./Docker/api/api.env
    environment:
     - NODE_ENV=production

当你运行容器时,环境变量文件中的会优先使用:

$ docker-compose exec api node

> process.env.NODE_ENV
'production'

Dockerfile中通过ARGENV设置的任何环境变量,都只有在Compose中没有设置environmentenv_file字段时,才会生效。

NodeJS容器中的特别说明

如果你在package.json中设置了script:start的入口,类似于 NODE_ENV=test node server.js, 那么这里指定的环境变量(NODE_ENV)优先级比 docker-compose.yml文件中的任何方式指定的都要高。

使用环境变量配置Docker Compose的行为

有一些特别的环境变量,可以帮助你设置一些Docker Compose命令行的行为。这些环境变量名以COMPOSE_DOCKER_开头。具体可以参考命令行环境变量文档。

通过容器连接创建的环境变量

v1版的Compose文件中有个‘links’选项,该选项会为每个连接容器创建相关的环境变量。具体参见:连接环境变量指南.

另外需要注意的是,这些环境变量不再建议使用。如有需求请通过hostname别名来代替。