Compose有多个部分以一种或另一种方式处理环境变量。
您可以在shell中使用环境变量来填充Compose file中的值:
web:
image: "webapp:${TAG}"
您可以使用“ environment”键在服务容器中设置环境变量,就像docker run -e VARIABLE = VALUE …一样:
web:
envrionment:
- DEBUG=1
容器中DEBUG变量的值取自运行Compose shell程序中同一变量的值。
您可以使用“ env_file”选项将多个环境变量从外部文件传递到服务的容器,就像docker run --env-file = FILE …一样:
web:
env_file:
- web-variable.env
就像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
容器中DEBUG变量的值取自运行Compose shell程序中同一变量的值。
您可以在名为.env的环境文件中为在Compose file中引用或用于配置Compose的任何环境变量设置默认值:
$ cat .env
TAG=v1.5
$ cat docker-compose.yml
version: '3'
services:
web:
image: "myapp:${TAG}"
Shell中的值优先于.env文件中指定的值。 如果在shell程序中将TAG设置为其他值,则image中的替换将使用该值:
$ export TAG=v2.0
$ docker-compose config
version: '3'
services:
web:
image: 'myapp:v2.0'
当您在多个文件中设置相同的环境变量时,以下是Compose用于选择要使用的值的优先级:
1.Compose file #docker-compose.yml
2. Shell environment variables # export TAG=v2.0
3. Environment file #.env
4. Dockerfile
5. Variable is not defined #变量未定义
在下面的示例中,我们在Environment文件和Compose文件上设置了相同的环境变量:
$ cat ./Docker/api/api.env
NODE_ENV=test
$ cat docker-compose.yml
version: '3'
services:
web:
image: ‘node:6-alpine’
env_file:
- ./Docker/api/api.env
environment:
- NODE_ENV=production
运行容器时,在Compose文件中定义的环境变量优先。
$ docker-compose exec api node
>process.env.NODE_ENV
'production'
仅在没有Docker Compose 输入 environment或env_file时,才对Dockerfile中的任何ARG或ENV设置进行评估。
NodeJS容器的细节
如果您有一个script:start之类的package.json条目,例如NODE_ENV = test node server.js,那么这将覆盖您docker-compose.yml文件中的所有设置。
可以使用几个环境变量来配置Docker Compose命令行行为。 它们以COMPOSE_或DOCKER_开头,并记录在CLI环境变量中。