如何为 docker compose 服务指定多个“env_files”?

flo*_*olu 43 docker-compose

目前我已经设置了我的服务,如下所示。

version: '3'
services:
  gateway:
    container_name: gateway
    image: node:lts-alpine
    working_dir: /
    volumes:
      - ./package.json:/package.json
      - ./tsconfig.json:/tsconfig.json
      - ./services/gateway:/services/gateway
      - ./packages:/packages
      - ./node_modules:/node_modules
    env_file: .env
    command: yarn run ts-node-dev services/gateway --colors
    ports:
      - 3000:3000
Run Code Online (Sandbox Code Playgroud)

所以我指定了一个env_file。但现在我想传递多个 .env 文件。

不幸的是,以下情况是不可能的:

    env_files:
       - .env.secrets
       - .env.development
Run Code Online (Sandbox Code Playgroud)

有没有办法将多个 .env 文件传递​​给 docker-compsoe 中的一项服务?

con*_*com 33

您可以在选项上指定多个环境文件env_file(不带s)。

例如:

version: '3'

services:
  hello:
    image: alpine
    entrypoint: ["sh"]
    command: ["-c", "env"]
    env_file:
      - a.env
      - b.env
Run Code Online (Sandbox Code Playgroud)

  • 看来,使用此方法,无法在 docker-compose.yaml 内部访问 .env 中的键/值,就像使用 CLI `--env-file <path to .env>` 如果使用 `docker compose 时那样上`。https://docs.docker.com/compose/environment-variables/ 希望可以节省某人的时间。 (6认同)

小智 11

请注意,与 @conradkleineespel 的答案互补的是,如果在 下列出的多个 .env 文件中定义了环境变量env_file,则列表中最后一个环境文件中找到的值将覆盖所有先前的值(在 docker-compose 文件中使用 .env 进行测试)version: '3.7'

  • @Mitya是的,这里的官方文档中有明确说明:https://docs.docker.com/compose/compose-file/compose-file-v3/#env_file“请记住列表中文件的顺序对于确定分配给多次出现的变量的值很重要。列表中的文件是从上到下处理的。对于在文件 a.env 中指定的相同变量并在​​文件 b.env 中分配了不同的值,如果 b.env 列在下面(之后),则 b.env 的值有效。” (2认同)

Ale*_*lia 8

从版本 2.17.0 开始(现在是rc.1,但很快就会是 2.17.0 ),您可以指定多个文件作为 cli 参数:sudo docker compose --env-file .env --env-file dev.env up

优点:

  1. 您可以访问 docker-compose.yaml 中的键/值。
  2. 您不需要env_file在多个服务中重复部分。

缺点:

  1. 更多角色在指挥。
  2. 当您调用类似命令时,sudo docker compose logs您将需要指定 --env-file .env --env-file dev.env. 否则你会看到类似的错误WARN[0000] The "VAR_NAME" variable is not set. Defaulting to a blank string