Почему Нельзя Использовать Логическое Значение В Docker-Compose.yml?

  • Автор темы IVD0210
  • Обновлено
  • 21, Oct 2024
  • #1

Определение логического значения в файле docker-compose.yml:

 
 
 environment:

RACK_ENV: development

SHOW: 'true'

SESSION_SECRET:

environment:

- RACK_ENV=development

- SHOW=true

- SESSION_SECRET
 

и бег 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 results in:

yes

Попытки решить проблему

  1. Если значение true изменено на True, проблема сохраняется.
  2. С использованием yes is not accepted by the code itself (приложение игровой платформы начинается с использованием no , i.e. either yes или -Dplay.evolutions.db.default.autoApply=false parameter):

    VAR имеет тип STRING, а не BOOLEAN.

  3. С использованием -Dplay.evolutions.db.default.autoApply=true or ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply= в качестве переменной приводит к:

    содержит true, что является недопустимым типом, оно должно быть строкой, числом или нулевым значением.

  4. С использованием 'true' and using a script that transforms contains true, which is an invalid type, it should be a string, number, or a null к истинным делам

Обсуждение

Согласно документам docker up :

Среда

Добавьте переменные среды. Вы можете использовать либо массив, либо

environment: SOME_VAR: true

словарь. Любые логические значения; правда, ложь, да нет, должно быть

заключены в кавычки, чтобы гарантировать, что они не будут преобразованы в True или False.

IVD0210


Рег
19 Jan, 2012

Тем
67

Постов
182

Баллов
547
  • 25, Oct 2024
  • #2

Это связано с выбором дизайна языка YAML. логические значения

Каждое значение без кавычек, соответствующее этому «регулярному выражению»:

 
 
 
 
 environment:

MY_VAR: "true"
 

Будет преобразован в true or AUTOAPPLY=false if [ "$SOME_VAR" == "true" ] then AUTOAPPLY=true fi ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=$AUTOAPPLY . Обратите внимание, что из ЯМЛ 1.2 и далее оказывается, что только env_file and yes будут интерпретироваться как логические значения.

Это начинает вызывать проблемы, когда ваш код будет проверять значение среды на «да» или «нет», например, используя этот сценарий (другие примеры в пиар-дискуссии):

True

И установка в вашем файле компоновки

SOME_VAR

приведет к environment: SOME_VAR: yes being if [ "$SOME_VAR" == "yes" ]; then echo "Variable SOME_VAR is activated" else echo "Variable SOME_VAR is NOT activated" fi при запуске сценария, следовательно, принимается неправильный регистр, поскольку он не равен false .

Итак, выбор было сделано к запретить логическое значение чтобы предотвратить нежелательное поведение, которое трудно отладить, если вы не знаете о правиле YAML.

Я вижу два пути решения проблемы:

  1. Используя true вместо этого они не анализируются IIRC и должны препятствовать преобразованию.

  2. Как вы уже сказали, вместо этого используйте сценарий-оболочку вокруг вашего средства запуска, чтобы определить значение перед запуском приложения, что-то вроде этого должно сделать:

    False
 

Nurudeen


Рег
27 Jul, 2010

Тем
59

Постов
209

Баллов
534
  • 25, Oct 2024
  • #3

Это ЯМЛ. Он интерпретирует True as a boolean. Envars must be strings, hence the requirement to make the type explicit via quotes.

Проверьте это с помощью https://www.json2yaml.com/

 

Fantasmanegro


Рег
13 Jun, 2006

Тем
91

Постов
194

Баллов
669
  • 25, Oct 2024
  • #4

двойные кавычки сработали для меня. Пример:

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

Nojwan


Рег
20 Jul, 2011

Тем
64

Постов
162

Баллов
532
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно