docker-compose.ymlでブール値を使用できないのはなぜですか?


24

docker-compose.ymlファイルでブール値を定義する:

environment:
  SOME_VAR: true

および実行docker up結果:

contains true, which is an invalid type, it should be a string, number, or a null

問題を解決しようとする

  1. trueがTrueに変更された場合、問題は解決しません。
  2. 使用して'true'(コード自体によって受け入れられないプレイフレームワークアプリを使用して開始され./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=、すなわちいずれか-Dplay.evolutions.db.default.autoApply=trueまたは-Dplay.evolutions.db.default.autoApply=falseパラメータ):

    VARにはBOOLEANではなくSTRING型があります

  3. yesまたはnoを変数として使用すると:

    trueを含みます。これは無効なタイプであり、文字列、数値、またはnullである必要があります

  4. True yesWorksに変換するスクリプトの使用と使用yes

討論

ドキュメントによると Any boolean values; true, false, yes no, need to be enclosed in quotes to ensure they are not converted to True or False by the YML parser

環境

環境変数を追加します。配列または辞書のいずれかを使用できます。ブール値。true、false、yes no、YMLパーサーによってTrueまたはFalseに変換されないように、引用符で囲む必要があります。

キーのみの環境変数は、Composeが実行されているマシン上の値に解決されます。これは、シークレットまたはホスト固有の値に役立ちます。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

質問

なぜ許可されないのですか?


4
DevOpsについてではありませんか?DevOps Stack Exchange is a question and answer site for software engineers working on automated testing, continuous delivery, service integration and monitoring, and building SDLC infrastructure
030

1
Aurora0001質問更新@
030

回答:


18

これは、ブール値に関するYAML言語の設計上の選択によるものです。

この「正規表現」に一致するすべての引用符で囲まれていない値:

 y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF

True またはに変換されFalseます。

これにより、コードが環境値をyesまたはnoにテストするときに、たとえばこのスクリプト(PRディスカッションのその他の例)を使用する場合に問題が発生し始めます。

if [ "$SOME_VAR" == "yes" ];
then
  echo "Variable SOME_VAR is activated"
else
  echo "Variable SOME_VAR is NOT activated"
fi

作成ファイルの設定

environment:
  SOME_VAR: yes

スクリプトの実行時にSOME_VAR存在Trueすることになります。したがって、に等しくないため、間違ったケースを使用しyesます。

そのため、YAMLルールを知らないときにデバッグが困難な望ましくない動作を防ぐために、ブール値許可ないという選択が行われました。

私は問題を乗り越えるための2つの方法を見ます:

  1. env_file代わりにを使用すると、IIRCが解析されず、変換が妨げられます。

  2. 既に述べたように、アプリを起動する前に、代わりにランチャーのラッパースクリプトを使用して値を定義します。

    AUTOAPPLY=false
    if [ "$SOME_VAR" == "true" ]
    then
        AUTOAPPLY=true
    fi
    
    ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=$AUTOAPPLY
    

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.