web-dev-qa-db-ja.com

Docker-compose、条件付きステートメント(例:条件の場合のみボリュームを追加)

私のサービスにボリュームを追加したいのですが、それは最終ユーザーがフォルダーを与えた場合に限られます。それ以外の場合は、ボリュームをマウントしないでください。すでに準備されているイメージには、デフォルトのフォルダーに有効なデータが含まれています。

つまり、次のようなことをしたいのです。疑似コード:

services:

  my_awesome_service:

    volumes:
      if ${VARIABLE} => ${VARIABLE}:/app/folder

そのような条件ステートメントをdocker-composeファイルで実行可能および定義可能に確立していますか?これを可能にする唯一の方法は、ボリュームマウントを持たない基本docker-composeファイルを最初に定義することです。 、および2番目のdocker-composeファイルの呼び出しは、$VARIABLEが定義されています。これは単一または少数の条件では問題ありませんが、多数ある場合は厄介になります。

解決策はありますか?

15
juanmirocks

このようなものは現在存在しません。私が思いつくことができるこれを実装するためのオプションは次のとおりです:

  1. たくさんのコンポーズファイルを作成し、最終的なファイルを構築するために必要なパーツをマージします。

  2. 作成ファイルを動的に生成します。 jsonnet のようなものが出発点として適しているかもしれません。

  3. 作成をスキップして、動的にdocker runコマンド。これは移植性に欠け始めていますが、いくつかのユースケースは自分でスクリプトを書く方が簡単です。

  4. コンポーズおよびdocker/cli githubリポジトリにPRを送信して、コンポーズ機能を拡張します。これをgolangテンプレート構文で行うことは、私にとって最も理にかなっています。

4
BMitch

貧乏人の解決策:

    volumes:
      ${VARIABLE:-/dev/null}:/app/folder

または:

    volumes:
      ${VARIABLE:-/dev/null}:${VARIABLE:-/tmp}/app/folder
1
gatopeich

ええ、私はdocker-composeのフォーマットが条件付きステートメントをサポートしているとは思いません。

ただし、2つの解決策があります。

  1. 「複雑な」(リストのような)変数を この例では などのdocker-composeに渡します:

docker-compose.yaml:

command: ${COMMAND_PARAMS}

bash:

#!/bin/bash
if test -z $CONDITION; then
  params="-param1 ${MIPARAM1}"
else
  params="-param1 ${MIPARAM1} -param2 ${MIPARAM2}"
fi
COMMAND_PARAMS=$params docker-compose up

(クレジットはgithubの元のポスター、@ shin-に送られます)

  1. folder_defaultsのような名前のフォルダーにあるdocker imageのデフォルトフォルダーを準備し、次にdocker-compose.ymlでボリュームを常に定義しますが、最後に、ボリュームがフォルダは空で、空の場合はln -sからfolder_defaultsへ。それ以外の場合はそのままにします。

条件付きスクリプトの例:

if [ -z "$(ls -A /a/folder)" ]; then
  do something... using /a/folder_defaults
fi
0
juanmirocks

オーケストレーションにRancherを使用している場合、エスケープ{{...}}} availableは、Rancherバージョンのdocker-composeの条件ステートメントに使用できます。

統合されたGOテンプレートシステムの詳細については こちら をご覧ください。

0
WeSee