docker-compose.yml与多个env_files

我试图得到一个.env -compose文件与多个.env文件,我没有任何运气。 我试图设置三个.env文件:

  • 在所有容器实例中相同的全局设置
  • 环境特定的设置(东西只是为了testing或开发)
  • 本地设置 – 开发人员在与端口号发生冲突的情况下可能需要更改的可重写事项

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] 

从这个错误信息,它看起来像我的环境variables没有被使用。 我刚刚升级到最新的可用docker组成 – 同样的错误:

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

这里有什么想法? 如果有一个docker-compose.yml可以在多个环境中工作,那将是非常好的。

阅读本页: https : //docs.docker.com/compose/environment-variables/

从我的理解,你应该做以下几点:

对于全局variables(不应该改变)做一个env文件,如下所示:

 VAR1=VALUE1 VAR2=VALUE2 

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

 environment: - VAR1 - VAR2 

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

我希望这有帮助。

请记住,有2个不同的环境,你正在定义variables。 你正在执行docker-compose命令的主机,以及容器本身(在你的情况下运行数据库服务)。

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

相反, ENV的值在容器内部是不可访问的,但是.env文件中定义的所有variables.env可以的。

我不知道你是否真的需要你的db容器来访问你的.env.development定义的variables。 但至less似乎你的主机需要有这个文件的内容,所以当docker-compose命令被调用时, POSTGRES_PORTvariables被定义。

要解决您的具体问题,您需要在主机上定义环境variables,而不仅仅是容器。 你可以做这样的事情:

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

希望有所帮助。