跳转至

在 Compose 文件中替换环境变量

(1. 可在外部传参至 compose 文件中

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

如果您有多个环境变量,则可以通过将它们添加到名为的默认环境变量文件中.env或使用--env-file命令行选项提供环境变量文件的路径来替换它们。

使用 --env-file 选项

通过将文件作为参数,你可以存储在任何位置,并适当命名,例如.env.ci,.env.dev,.env.prod。使用以下--env-file选项完成文件路径的传递:

docker-compose --env-file ./config/.env.dev up 

该文件路径相对于执行Docker Compose命令的当前工作目录的。

$ cat .env
TAG=v1.5

$ cat ./config/.env.dev
TAG=v1.6


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

该.env文件是默认加载的:

$ docker-compose config 
version: '3'
services:
  web:
    image: 'webapp:v1.5'

提交--env-file 参数将覆盖默认文件路径:

$ docker-compose --env-file ./config/.env.dev config 
version: '3'
services:
  web:
    image: 'webapp:v1.6'

当将无效的文件路径作为--env-file参数提交时,Compose 返回错误:

$ docker-compose --env-file ./doesnotexist/.env.dev  config
ERROR: Couldn't find env file: /home/user/./doesnotexist/.env.dev

在容器中设置环境变量

您可以使用'environment'键在服务的容器中设置环境变量 ,就像这样 docker run -e VARIABLE=VALUE ...:

web:
  environment:
    - DEBUG=1

将环境变量传递给容器

您可以使用'environment'键将环境变量从外壳直接传递到服务的容器,方法是 不给它们赋值,就像使用docker run -e VARIABLE ...:

web:
  environment:
    - DEBUG

所述的值DEBUG在容器变量是从值取为在其中撰写运行在壳中的相同变量。

“ env_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

Shell 中的值优先于 .env 文件中指定的值。如果在 Shell 上把 TAG 设置为其它值,则会被替换为该值

.env 文件

  • 可在名为的环境文件中为在 Compose 文件中引用或用于配置Compose的任何环境变量设置默认值 .env。该 .env文件路径如下:

    • 随着启动+v1.28,.env文件被放置在项目目录的基础上

    • 对于以前的版本,除非--project-directory定义了一个来覆盖.env文件的路径,否则就会放置在执行Docker Compose命令的当前工作目录中。+v1.28通过将文件路径限制为项目目录来解决此困惑问题。

你可以在名为 '.env' 的环境变量文件中,为 Compose 中引用或者用于配置 Compose 的任何环境变量设置默认值:

$ cat .env
TAG=v1.5

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

当你运行 docker-compose up,上面定义的 Web 服务使用镜像 webapp:v1.5。你可以使用 config 命令验证这一点,该命令会将你解析的应用程序配置输出到终端:

$ docker compose config

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

Shell 中的值优先于 .env 文件中指定的值。如果在 Shell 上把 TAG 设置为其它值,则会被替换为该值:

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

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

Note

当你在多个文件中设置了相同的环境变量时,以下为 Compose 使用的优先级顺序:

1. Compose 文件
2. Shell 环境变量的值
3. 环境变量文件.env
3. Dockerfile
5. 环境变量未定义

在下面的示例中,我们在Environment文件和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'

仅当 Compose 文件中没有 'enviroment' 或者 'env_file' 条目时,才会对 Dockerfile 中的 ARG 或 ENV 设置进行评估。

针对 NodeJS 容器,如果有一个 package.json 条目 script:start,类似 NODE_ENV=test node server.js,那么这将会覆盖 docker-compose.yml 文件中的环境变量。(其实不仅仅是 NodeJS,所有容器启动脚本相关的操作都会覆盖系统自身的环境变量)