Dlaczego nie wolno używać wartości logicznej w docker-compose.yml?

24

Definiowanie wartości logicznej w pliku docker-compose.yml:

environment:
  SOME_VAR: true

i prowadzenie docker upwyników w:

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

Próby rozwiązania problemu

  1. Jeśli wartość true zostanie zmieniona na True, problem będzie się powtarzał.
  2. Używanie 'true'nie jest akceptowana przez samego kodu ( app ramy gra jest uruchamiana za pomocą ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=IE albo -Dplay.evolutions.db.default.autoApply=trueczy -Dplay.evolutions.db.default.autoApply=falseparametr):

    VAR ma typ STRING, a nie BOOLEAN

  3. Użycie yeslub nojako zmiennej powoduje:

    zawiera true, który jest niepoprawnym typem, powinien być ciągiem, liczbą lub null

  4. Używanie yesi używanie skryptu, który przekształca yessię w prawdziwe dzieła

Dyskusja

Według dokumentów 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 :

Środowisko

Dodaj zmienne środowiskowe. Możesz użyć tablicy lub słownika. Wszelkie wartości logiczne; prawda, fałsz, tak nie, muszą być ujęte w cudzysłowy, aby upewnić się, że nie zostaną przekonwertowane na parser YML na Prawdę lub Fałsz.

Zmienne środowiskowe tylko z kluczem są rozpoznawane na ich wartościach na komputerze, na którym działa Compose, co może być pomocne w przypadku wartości tajnych lub specyficznych dla hosta.

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

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

Pytanie

Dlaczego nie jest to dozwolone?

030
źródło
4
Nie o 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
@ Zaktualizowano pytanie Aurora0001
030

Odpowiedzi:

18

Pochodzą one z wyboru projektu języka YAML na temat booleanów

Każda niecytowana wartość pasująca do tego „wyrażenia regularnego”:

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

Zostanie przekonwertowany na True lub False.

To zaczyna powodować problem, gdy twój kod przetestuje wartość środowiska na tak lub nie, na przykład biorąc ten skrypt (inne przykłady w komentarzu PR ):

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

I ustawienie w pliku tworzenia

environment:
  SOME_VAR: yes

Spowoduje SOME_VARto True, że będzie działał, gdy skrypt zostanie uruchomiony, a zatem weźmie niewłaściwy przypadek, ponieważ nie jest równy yes.

Więc wybór został złożony do zabronić logiczna , aby zapobiec niechcianych zachowań trudne do debugowania, gdy nie jesteś świadomy reguły YAML.

Widzę dwa sposoby na rozwiązanie problemu:

  1. Używając env_filezamiast tego, nie są one analizowane IIRC i powinny zapobiegać konwersji.

  2. Jak już powiedziałeś, użyj skryptu opakowania wokół programu uruchamiającego, aby zdefiniować wartość przed uruchomieniem aplikacji, coś w tym celu powinno zrobić:

    AUTOAPPLY=false
    if [ "$SOME_VAR" == "true" ]
    then
        AUTOAPPLY=true
    fi
    
    ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=$AUTOAPPLY
    
Tensibai
źródło
9

To jest YAML. To interpretuje truejako wartość logiczną. Envary muszą być ciągami, stąd wymóg wyraźnego określenia typu za pomocą cudzysłowów.

Przetestuj to za pomocą https://www.json2yaml.com/

Assaf Lavie
źródło
Mówiąc bardziej ogólnie, cytaty nie pojawią się w samej wartości, ponieważ są formatowaniem YAML.
coderanger