Почему нельзя использовать логическое значение в 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, yes no, должны быть заключены в кавычки, чтобы они не были преобразованы в True или False синтаксическим анализатором YML.

Переменные среды, имеющие только ключ, преобразуются в их значения на компьютере, на котором работает Compose, что может быть полезно для секретных или специфичных для хоста значений.

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

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

Вопрос

Почему это не разрешено?

030
источник
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
    
Tensibai
источник
9

Это ЯМЛ. Это интерпретирует trueкак логическое значение. Envars должны быть строками, поэтому необходимо сделать тип явным через кавычки.

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

Ассаф Лави
источник
В более общем смысле кавычки не будут отображаться в самом значении, поскольку они имеют формат YAML.
Coderanger