不同的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 up
或docker-compose run
?
请参阅下面的更新#2。 这现在是可能的!
这是Docker Compose所要求的特性。 不幸的是,目前的答案是你不能。 我build议订阅这些GitHub的问题,以获得更好的主意,当这个function得到实施:
- https://github.com/docker/compose/issues/495
- https://github.com/docker/compose/pull/76
- https://github.com/docker/compose/pull/845
问题#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.}\""'