web-dev-qa-db-ja.com

Docker Composeで異なるenv-fileが同じymlですか?

複数の環境(たとえば、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 updocker-compose runを指定できないのはなぜですか?

25
Johan

以下のアップデート#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 をご覧ください。

17
Andy Shinn

コマンドラインからの直接のインクルードではありませんが、 #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 が許可するものよりもはるかに強力であることがわかります。

6
posita

わかりやすい例ですが、base.ymlを更新してash Shellを呼び出すまで、これは最初はうまくいきませんでした。

base.yml

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