指定 docker compose 使用的 env 文件

Zur*_*iar 16 docker docker-compose

是否可以指定 docker compose 用于变量替换的 env 文件?目前它默认为“.env”,但我有不同风格的撰写文件,应该有不同的环境。

Pet*_*mau 12

命令--env-file行参数和env_filedocker-compose.yml 变量指定用于容器的 env 文件,而不是用于容器构建。要为构建本身设置不同的文件(例如alt.env ),请使用以下命令:

env $(cat alt.env) docker-compose up --build
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到文档中任何地方提到的 --env-file 仅适用于服务部署而不适用构建的区别:https://docs.docker.com/compose/environment-variables/#using-the-- -env-file--option 这看起来确实很奇怪。但经过更多挖掘后,环境文件的使用在 v2 上已经被破坏了很多年:https://github.com/docker/compose/issues/8515 (3认同)
  • 正确,这不是有记录的行为。 (2认同)

nwi*_*ler 10

您可以为此使用继承。如果您有一个用于设置环境的“基础”服务,则所有其他服务都可以继承该服务。

例子:

version: "2"

services:
  base:
    env_file:
      - my_env.txt

  web:
    extends:
      service: base
    image: foo

  database:
    extends:
      service: base
    image: foo-db
Run Code Online (Sandbox Code Playgroud)

上面的示例在同一个文件中包含所有内容,但您也可以将其拆分为多个文件,其中base服务将驻留在一个base.yaml文件中。您只需要添加file: base.yaml到该extends部分。请参阅此处的文档

我使用这种方法为所有容器设置代理变量。我有一个proxy.yaml文件,它定义了一个proxy-app从 shell 中获取代理环境变量的服务。我所有的真实服务都扩展了proxy-app服务,从而继承了该服务的环境设置。

  • 注意:在 docker compose v3 及更高版本中不起作用 (4认同)
  • 这在 Docker Compose v3+ 上不起作用,因为每个服务都必须有一个定义的映像或构建上下文。记录[此处](https://docs.docker.com/compose/compose-file/compose-file-v3/#build)并讨论[此处](/sf/ask/4463685201/笔记本至少没有指定图像或构建上下文) (3认同)

Har*_*she 6

根据文档,现在可以加载环境文件(与每个服务文件相反),docker-compose 将在启动任何服务之前导出此 env 文件中定义的 env 变量,然后可以在docker-compose.yml 配置文件本身:

version: "3.7"
services:
  
  node:
    environment:
      APP_ENV: "${APP_ENV}"
      NODE_ENV: "${NODE_ENV}"
    ports:
      - "${HOST_EXPOSED_NODEJS_DEBUG_PORT}:9229"
    volumes:
      - type: bind
        source: ./project
        target: /var/www/project
        read_only: false
Run Code Online (Sandbox Code Playgroud)

docker-compose 1.25开始,还可以使用--env-file 标志指定自定义 .env 文件(不幸的是,目前无法使用--env-file 标志指定多个 .env 文件

  • 这是误导性的。--env-file 用于指定容器的*环境变量*,*不*用于指定要在 docker-compose.yml 中替换的值。 (5认同)