複数の環境(たとえば、testとprod)があることは非常に一般的ですが、開始したいDockerコンテナーは両方の環境で同じです。唯一の違いは、env-file
を使用して指定するアプリケーション構成です。複数のコンテナとそれらの間の依存関係があるため、 docker-compose を使用します。しかし、私はenv-file
ファイル内でdocker-compose.yml
のみを指定できます( docs を参照)。この場合、元のdocker-compose.yml
を2つの異なるファイル(テスト用とprod用)に複製して、異なるenvファイルを指すようにする必要があります。つまり、1つではなく2つのdocker-compose.yml
ファイルを維持する必要があり、変更を加える場合は両方のファイルを更新する必要があります。
これは本当に設計どおりですか? docker-compose
または--env-file
を行うときにdocker-compose up
でdocker-compose run
を指定できないのはなぜですか?
以下のアップデート#2を参照してください。これが可能になりました!
これは、Docker Composeの要望の多い機能です。残念ながら、現時点での答えは、できないということです。この機能が実装された場合、および実装された場合、より良いアイデアを得るために、これらのGitHubの問題にサブスクライブすることをお勧めします。
課題#495は、現時点では、課題リポジトリで最も多くコメントされています。あなたは間違いなくこれをしたいだけではありません。
更新:
最新の問題追跡は https://github.com/docker/compose/issues/1377 にあります。
アップデート#2:
この機能は統合されており、Docker Compose 1.5.0以降で利用可能です。使用方法については、 https://github.com/docker/compose/blob/129092b7/docs/yml.md#variable-substitution をご覧ください。
コマンドラインからの直接のインクルードではありませんが、 #1765 merge ( #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
ファイル。制限されていない場合は、環境固有の「接着剤」で環境変数の設定を保持できます.yml
ファイル:
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 merge が許可するものよりもはるかに強力であることがわかります。
わかりやすい例ですが、base.ymlを更新してash Shellを呼び出すまで、これは最初はうまくいきませんでした。
base.yml
base:
image: busybox
command: ash -c 'echo "${WHO:-Simon} says, \"${SHOUTOUT:-Silence is golden.}\""'