不同的env文件,但是与Docker Compose相同的yml?

我发现我有多个环境(例如test和prod)是相当普遍的,但是我希望启动的Docker容器在两种环境中都是相同的。 唯一的区别是我想使用env-file指定的应用程序configuration。 因为我有他们之间的多个容器和依赖关系,我想使用docker-compose 。 但是afaik我只能在docker-compose.yml文件中指定一个env-file文件(请参阅文档 )。 如果是这种情况,那么我需要将我的原始docker-compose.yml克隆到两个不同的文件(一个用于testing,一个用于prod),以指向不同的env文件。 这意味着我必须维护两个docker-compose.yml文件,而不是一个,如果我做任何更改,我需要更新这两个文件。

这真的是根据devise? 为什么--env-file docker-compose不能让我指定--env-file当我做--env-file docker-compose updocker-compose run

请参阅下面的更新#2。 这现在是可能的!

这是Docker Compose所要求的特性。 不幸的是,目前的答案是你不能。 我build议订阅这些GitHub的问题,以获得更好的主意,当这个function得到实施:

问题#495实际上是目前在他们的问题存储库中评论最多的。 你绝对不是一个人想要做到这一点。

更新:

最新的问题跟踪在https://github.com/docker/compose/issues/1377

更新#2:

这个function已经被合并,从Docker Compose 1.5.0开始可用。 有关使用信息,请参阅https://github.com/docker/compose/blob/129092b7/docs/yml.md#variable-substitution

它不是直接包含在命令行中,但是如果在#1765合并 ( #1377修复)之前需要一个解决方法使其成为发行版,则可以使用extends指令和env_file指令 。 为方便起见,以下简单示例中的文件将在此存储库中重现。

愚蠢的简单的例子

base.yml

 base: image: busybox command: bash -c 'echo "${WHO:-Simon} says, \"${SHOUTOUT:-Silence is golden.}\""' 

one.env

 WHO=Da Schwartz SHOUTOUT=Get to... 

one_glue.yml

 one: extends: file: base.yml service: base env_file: - one.env 

two.env

 WHO=Da Schwartz SHOUTOUT=...da choppa! 

two_glue.yml

 two: extends: file: base.yml service: base env_file: - two.env 

使用

 % for i in base one_glue two_glue ; do docker-compose --file "${i}.yml" up ; done Recreating dockercomposeextendsenv_base_1... Attaching to dockercomposeextendsenv_base_1 base_1 | Simon says, "Silence is golden." dockercomposeextendsenv_base_1 exited with code 0 Gracefully stopping... (press Ctrl+C again to force) Recreating dockercomposeextendsenv_one_1... Attaching to dockercomposeextendsenv_one_1 one_1 | Da Schwartz says, "Get to..." dockercomposeextendsenv_one_1 exited with code 0 Gracefully stopping... (press Ctrl+C again to force) Recreating dockercomposeextendsenv_two_1... Attaching to dockercomposeextendsenv_two_1 two_1 | Da Schwartz says, "...da choppa!" dockercomposeextendsenv_two_1 exited with code 0 Gracefully stopping... (press Ctrl+C again to force) 

更简单的例子

以上的作品,如果你受益于使用.env文件。 如果你不是那么有限的话,你可以在环境特定的“glue” .yml文件中保留环境variables设置:

red_glue.yml

 red: extends: file: base.yml service: base environment: - WHO=Stallion - SHOUTOUT=I am... 

blue_glue.yml

 blue: extends: file: base.yml service: base environment: - WHO=Stallion - SHOUTOUT=...the law! 

使用

 % for i in red_glue blue_glue ; do docker-compose --file "${i}.yml" up ; done Creating dockercomposeextendsenv_red_1... Attaching to dockercomposeextendsenv_red_1 red_1 | Stallion says, "I am..." dockercomposeextendsenv_red_1 exited with code 0 Gracefully stopping... (press Ctrl+C again to force) Creating dockercomposeextendsenv_blue_1... Attaching to dockercomposeextendsenv_blue_1 blue_1 | Stallion says, "...the law!" dockercomposeextendsenv_blue_1 exited with code 0 Gracefully stopping... (press Ctrl+C again to force) 

稍微复杂一点

对于它的价值,这个答案中描述的方法允许每个实例的不同.env文件,而不是每个调用/环境。 (但是我不确定这在实践中有多么有用。)换句话说,你可以这样做:

testing.yml

 # Only instance1 and instance2 are needed for testing instance1: extends: file: base.yml service: base env_file: - test.env # environment-specific - instance1_test.env # instance-specific instance2: extends: file: base.yml service: base env_file: - test.env - instance2_test.env 

production.yml

 # All four instances are used for production instance1: extends: file: base.yml service: base env_file: - prod.env # environment-specific - instance1_prod.env # instance-specific instance2: extends: file: base.yml service: base env_file: - prod.env - instance2_prod.env instance3: extends: file: base.yml service: base env_file: - prod.env - instance3_prod.env instance4: extends: file: base.yml service: base env_file: - prod.env - instance4_prod.env 

你可以开始看到extends是非常强大的,比#1765合并允许的更多。

很好的清晰的例子,但是这个最初并没有为我工作,直到我更新base.yml来调用灰壳。

base.yml

 base: image: busybox command: ash -c 'echo "${WHO:-Simon} says, \"${SHOUTOUT:-Silence is golden.}\""'