具有多个env_files的docker-compose.yml

时间:2016-06-20 15:37:19

标签: 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

.env看起来像这样:

POSTGRES_USER=myapp

并且.env.development看起来像这样:

POSTGRES_PASSWORD=supersecretpassword
POSTGRES_HOST=localhost
POSTGRES_PORT=25432
POSTGRES_DB=myapp_development

.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]

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

$ docker-compose --version
docker-compose version 1.8.0-rc1, build 9bf6bc6

这里有什么想法吗?如果能够在多个环境中使用单个docker-compose.yml,那将会很不错。

4 个答案:

答案 0 :(得分:6)

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

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

相反,容器内部无法访问.env的值,但db文件中定义的所有变量都将为。

我不知道您是否真的需要.env.development容器来访问POSTGRES_PORT上定义的变量。但至少看起来您的主机需要拥有该文件的内容,因此在调用docker-compose命令时,会定义#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. 变量。

要解决您的特定问题,您还需要在主机上定义环境变量,而不仅仅是容器。你可以这样做:

@font-face {
  font-family: "Dense-Regular";
  src: url("Dense-Regular.otf");
}

希望有所帮助。

答案 1 :(得分:2)

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

例如:

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

docker-compose.yml

web:
  image: example/my_web_app:latest
  env_file:
    - .env

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

docker-compose.override.yml

web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  env_file:
    - .env.dev

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

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

docker-compose.prod.yml

web:
  ports:
    - 80:80
  env_file:
    - .env.prod

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

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

注意

我的Docker版本:

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

$ docker-compose -v
docker-compose version 1.22.0, build f46880fe

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

答案 2 :(得分:0)

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

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

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

{key:value}

和其他(可能会改变)你应该在docker-compose.yml的环境下添加他们的名字,如下所示:

VAR1=VALUE1
VAR2=VALUE2

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

我希望这会有所帮助。

答案 3 :(得分:0)

关于docker-compose.yml中的.env文件和env_file选项存在误解,因为它非常模棱两可。 Shin在github问题docker-compose doesn't use env_file中很好地指出了这一点。我只引用他的摘要:

  
      
  • docker-compose.yml文件中的变量替换将从外壳环境和.env文件中拉出(按优先级降序排列)。

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

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

  •