Чому не можна використовувати булевий формат у 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 має тип STRING, а не BOOLEAN

  3. Використання yesабо noяк змінна призводить до:

    містить true, який є недійсним типом, він повинен бути рядком, числом або нулем

  4. Використання yesта використання сценарію, який перетворюється 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, так ні, потрібно включати в лапки, щоб переконатися, що вони не перетворюються в True або False за допомогою парцелятора YML.

Змінні середовища, що містять лише ключ, вирішують їхні значення на машині. 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.

Це початок спричиняє проблему, коли ваш код перевірить значення середовища на "так" або "ні", наприклад, взявши цей скрипт (інші приклади в дискусії 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.

Я бачу два шляхи подолання проблеми:

  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
    

9

Це YAML. Це трактується trueяк булева. Envars повинні бути рядками, звідси і вимога зробити тип явним через лапки.

Перевірте це за допомогою https://www.json2yaml.com/


Більш загально, лапки не відображатимуться у самому значенні, оскільки вони є форматом YAML.
кодерангер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.