【问题标题】:Specify the env file docker compose uses指定 docker compose 使用的 env 文件
【发布时间】:2016-11-10 10:25:41
【问题描述】:

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

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

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

例子:

version: "2"

services:
  base:
    env_file:
      - my_env.txt

  web:
    extends:
      service: base
    image: foo

  database:
    extends:
      service: base
    image: foo-db

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

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

【讨论】:

  • 注意:不适用于 docker compose v3 及更高版本
  • 这在 Docker Compose v3+ 上不起作用,因为每个服务都必须有一个定义的图像或构建上下文。记录here 并讨论here
  • 这并没有解决问题,即如何指定不同的 .env 文件,而是提供了一种解决方法,这对于正在寻找解决方案的绝大多数观众来说没有用出于各种原因提出的问题
【解决方案2】:

根据documentation,现在可以加载环境文件(与 per-service 文件相反),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

由于docker-compose 1.25,还可以使用--env-file flag 指定自定义.env 文件(不幸的是,目前无法指定multiple .env files with the --env-file flag

【讨论】:

  • 这是误导。 --env-file 用于为容器指定 环境变量not 用于指定要在 docker-compose.yml 中替换的值。
【解决方案3】:

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

env $(cat alt.env) docker-compose up --build

【讨论】:

猜你喜欢
  • 2021-06-10
  • 2023-01-17
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2019-10-21
  • 2018-02-11
相关资源
最近更新 更多