具有多个env_files的docker-compose.yml

mat*_*att 14 docker docker-compose

我试图让一个docker-compose文件处理多个.env文件,我没有运气.我正在尝试设置三个.env文件:

  • 所有容器实例中的全局设置相同
  • 特定于环境的设置(仅用于测试或开发的东西)
  • 本地设置 - 开发人员可能需要更改的可覆盖的东西,以防它们与端口号发生冲突

我的docker-compose.yml文件看起来像这样:

version: '2'
services:
  db:
    env_file:
      - ./.env
      - ./.env.${ENV}
      - ./.env.local
    image: postgres
    ports:
      - ${POSTGRES_PORT}:5432
Run Code Online (Sandbox Code Playgroud)

.env 看起来像这样:

POSTGRES_USER=myapp
Run Code Online (Sandbox Code Playgroud)

.env.development看起来像这样:

POSTGRES_PASSWORD=supersecretpassword
POSTGRES_HOST=localhost
POSTGRES_PORT=25432
POSTGRES_DB=myapp_development
Run Code Online (Sandbox Code Playgroud)

.env.local 在这种情况下不存在.

运行后ENV=development docker-compose up,我收到以下输出:

$ ENV=development docker-compose up
WARNING: The POSTGRES_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The POSTGRES_DB variable is not set. Defaulting to a blank string.
WARNING: The POSTGRES_PORT variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.db.ports is invalid: Invalid port ":5432", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
Run Code Online (Sandbox Code Playgroud)

从该错误消息,看起来我的环境变量都没有被使用.我刚刚升级到最新的可用docker-compose - 同样的错误:

$ docker-compose --version
docker-compose version 1.8.0-rc1, build 9bf6bc6
Run Code Online (Sandbox Code Playgroud)

这里有什么想法?如果有一个docker-compose.yml可以在多个环境中工作的单一会很好.

Ric*_*fer 7

关于 docker-compose.yml 中的 .env 文件和 env_file 选项存在误解,因为它非常不明确。Shin在 github 问题docker-compose does not use env_file中很好地指出了这一点。我直接引用他的总结:

  • docker-compose.yml 文件中的变量替换将从 shell 环境和 .env 文件中提取(按优先级降序)。

  • 容器中可用的变量是 env_file 文件中找到的值和服务的环境部分中描述的值的组合。

  • 这是两组完全独立的功能。

  • 非常有帮助的答案。TL;DR:`.env` 用于 *compose*;`env_file` 用于*容器*! (4认同)

小智 6

请记住,在两种不同的环境中定义变量。您要在其中执行docker-compose命令的主机以及容器本身(在您的情况下运行db服务)。

您的docker-compose.yml文件可以访问主机的环境变量。因此ENV可以从docker-compose命令访问,但不能在.env文件中访问。

相反,ENV容器内无法获得for的值,但是.env文件中定义的所有变量都可以。

我不知道您是否真的需要db容器来访问您的上定义的变量.env.development。但至少看来您的主机需要该文件的内容,因此,在调用docker-compose命令时,将POSTGRES_PORT定义变量。

要解决您的特定问题,您不仅需要为容器,还需要在主机上定义环境变量。您可以执行以下操作:

#Set for host
ENV=development

#Also sets the variables on the host 
source ./.env.$ENV

#POSTGRES_PORT defined in .env.development is used here
docker-compose up

#since env_file also contains .env.development, the variables will be reachable from the container.
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助。


Yuc*_*uci 5

为了根据运行环境(例如开发/登台/生产)应用不同/多个env_files,我认为docker-compose的一种更好方法是使用多个docker-compose yml文件。

例如:

1.从定义服务的规范配置的基本文件开始。

docker-compose.yml

web:
  image: example/my_web_app:latest
  env_file:
    - .env
Run Code Online (Sandbox Code Playgroud)

2.添加用于开发的替代文件,顾名思义,它可以包含现有服务或全新服务的配置替代。

docker-compose.override.yml

web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  env_file:
    - .env.dev
Run Code Online (Sandbox Code Playgroud)

运行时,docker-compose up它将自动读取覆盖。

3.为生产环境创建另一个替代文件。

docker-compose.prod.yml

web:
  ports:
    - 80:80
  env_file:
    - .env.prod
Run Code Online (Sandbox Code Playgroud)

要使用此生产Compose文件进行部署,您可以运行

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
Run Code Online (Sandbox Code Playgroud)

注意

我的Docker版本:

$ docker -v
Docker version 18.06.1-ce, build e68fc7a

$ docker-compose -v
docker-compose version 1.22.0, build f46880fe
Run Code Online (Sandbox Code Playgroud)

参考:https : //docs.docker.com/compose/extends/


Dim*_*elu -2

阅读此页面时:https://docs.docker.com/compose/environment-variables/

根据我的理解,你应该执行以下操作:

对于全局变量(不应更改),创建一个 env 文件,如下所示:

VAR1=VALUE1
VAR2=VALUE2
Run Code Online (Sandbox Code Playgroud)

对于其他人(可能会改变),您应该在 docker-compose.yml 的环境下添加它们的名称,如下所示:

environment:
    - VAR1
    - VAR2
Run Code Online (Sandbox Code Playgroud)

这将从运行 docker-compose 的 shell 中获取 VAR1 和 VAR2 值。

我希望这有帮助。