Pourquoi n'est-il pas autorisé à utiliser un booléen dans un docker-compose.yml?

24

Définition d'un booléen dans un fichier docker-compose.yml:

environment:
  SOME_VAR: true

et les docker uprésultats en cours d'exécution dans:

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

Tentatives de résolution du problème

  1. Si true est changé en True, le problème persiste.
  2. L'utilisation 'true'n'est pas acceptée par le code lui-même ( une application de structure de lecture est démarrée à l'aide du paramètre ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=, c'est-à-dire soit -Dplay.evolutions.db.default.autoApply=trueou -Dplay.evolutions.db.default.autoApply=false):

    VAR a le type STRING plutôt que BOOLEAN

  3. L'utilisation de yesou nocomme variable entraîne:

    contient true, qui est un type non valide, il doit s'agir d'une chaîne, d'un nombre ou d'une valeur nulle

  4. Utiliser yeset utiliser un script qui se transforme yesen véritables œuvres

Discussion

Selon les documents 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 :

Environnement

Ajoutez des variables d'environnement. Vous pouvez utiliser un tableau ou un dictionnaire. Toutes les valeurs booléennes; true, false, yes no, doivent être placés entre guillemets pour garantir qu'ils ne sont pas convertis en True ou False par l'analyseur YML.

Les variables d'environnement avec seulement une clé sont résolues à leurs valeurs sur la machine sur laquelle Compose s'exécute, ce qui peut être utile pour les valeurs secrètes ou spécifiques à l'hôte.

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

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

Question

Pourquoi est-ce interdit?

030
la source
4
Pas sur 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 question mise à jour
030

Réponses:

18

Cela vient d'un choix de conception du langage YAML sur les booléens

Chaque valeur non cotée correspondant à cette "expression régulière":

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

Sera converti en True ou False.

Cela commence à poser un problème lorsque votre code testera une valeur d'environnement pour être oui ou non, par exemple en prenant ce script (autres exemples dans la discussion PR ):

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

Et mettre dans votre fichier de composition

environment:
  SOME_VAR: yes

Se traduira par SOME_VARêtre Truelorsque le script s'exécutera, prenant donc le mauvais cas car il n'est pas égal à yes.

Le choix a donc été fait de ne pas autoriser les booléens pour éviter les comportements indésirables difficiles à déboguer lorsque vous n'êtes pas au courant de la règle YAML.

Je vois deux façons de surmonter le problème:

  1. En utilisant un à la env_fileplace, ils ne sont pas analysés IIRC et devraient empêcher la conversion.

  2. Comme vous l'avez déjà dit, utilisez un script wrapper autour de votre lanceur pour définir la valeur à la place avant de lancer l'application, quelque chose dans le sens de cela devrait faire:

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

C'est YAML. Il interprète truecomme un booléen. Les envars doivent être des chaînes, d'où l'obligation de rendre le type explicite via des guillemets.

Testez cela avec https://www.json2yaml.com/

Assaf Lavie
la source
Plus généralement, les guillemets n'apparaîtront pas dans la valeur elle-même car ils sont au format YAML.
coderanger