Warum darf man in einer docker-compose.yml keinen Booleschen Wert verwenden?


24

Definieren eines Booleschen Werts in einer docker-compose.yml-Datei:

environment:
  SOME_VAR: true

und laufende docker upErgebnisse in:

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

Versuche, das Problem zu lösen

  1. Wenn true in True geändert wird, bleibt das Problem bestehen.
  2. Die Verwendung 'true'wird vom Code selbst nicht akzeptiert ( eine Play Framework-App wird mit dem Parameter ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=, dh entweder -Dplay.evolutions.db.default.autoApply=trueoder, gestartet -Dplay.evolutions.db.default.autoApply=false):

    VAR hat eher den Typ STRING als BOOLEAN

  3. Die Verwendung von yesoder noals Variable führt zu:

    enthält true, was ein ungültiger Typ ist. Es sollte eine Zeichenfolge, eine Zahl oder eine Null sein

  4. Verwenden yesund Verwenden eines Skripts, das yesin echte Werke umgewandelt wird

Diskussion

Nach den Dokumenten 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 :

Umgebung

Umgebungsvariablen hinzufügen. Sie können entweder ein Array oder ein Wörterbuch verwenden. Beliebige boolesche Werte; true, false, yes no müssen in Anführungszeichen gesetzt werden, um sicherzustellen, dass sie vom YML-Parser nicht in True oder False konvertiert werden.

Umgebungsvariablen mit nur einem Schlüssel werden auf dem Computer, auf dem Compose ausgeführt wird, in ihre Werte aufgelöst. Dies kann für geheime oder hostspezifische Werte hilfreich sein.

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

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

Frage

Warum ist es nicht erlaubt?


4
Nicht über 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 Frage aktualisiert
030

Antworten:


18

Dies kommt von einer Designauswahl der YAML-Sprache über Boolesche Werte

Jeder nicht zitierte Wert, der diesem "regulären Ausdruck" entspricht:

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

Wird konvertiert zu True oder False.

Dies führt zu einem Problem, wenn Ihr Code einen Umgebungswert als "Ja" oder "Nein" testet, indem Sie beispielsweise dieses Skript verwenden (andere Beispiele in der PR-Diskussion ):

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

Und in Ihrer komponierten Datei einstellen

environment:
  SOME_VAR: yes

Wird dazu führen SOME_VAR, Truedass das Skript ausgeführt wird, wodurch der falsche Fall verwendet wird, da er nicht gleich ist yes.

Deshalb ist die Wahl wurde gemacht , um boolean nicht zulassen unerwünschtes Verhalten schwer zu debuggen zu verhindern , wenn Sie keine Kenntnis von der YAML Regel sind.

Ich sehe zwei Möglichkeiten, um das Problem zu überwinden:

  1. Wenn Sie env_filestattdessen ein verwenden, werden sie nicht als IIRC analysiert und sollten die Konvertierung verhindern.

  2. Verwenden Sie, wie bereits erwähnt, ein Wrapper-Skript um Ihren Launcher, um den Wert zu definieren, bevor Sie die App starten. Dies sollte folgendermaßen aussehen:

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

9

Das ist YAML. Es wird trueals Boolescher Wert interpretiert . Envars müssen Zeichenfolgen sein, daher muss der Typ in Anführungszeichen angegeben werden.

Testen Sie dies mit https://www.json2yaml.com/


Im Allgemeinen werden die Anführungszeichen nicht im Wert selbst angezeigt, da sie im YAML-Format vorliegen.
Coderanger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.