Neden bir dock-compose.yml içinde bir Boolean kullanılmıyor?


24

Bir docker-compose.yml dosyasında bir boole tanımlama:

environment:
  SOME_VAR: true

ve docker upsonuçları çalıştıran :

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

Sorunu çözme girişimleri

  1. True true olarak değiştirilirse sorun devam eder.
  2. Kullanımı 'true'kodun kendisi tarafından kabul edilmez ( bir./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply= ya -Dplay.evolutions.db.default.autoApply=trueda -Dplay.evolutions.db.default.autoApply=falseparametresi kullanılarak bir oyun çerçevesi uygulaması başlatılır ):

    VAR, BOOLEAN yerine STRING türüne sahip

  3. Değişken olarak yesveya kullanılması aşağıdakilerle nosonuçlanır:

    true olan, geçersiz bir tür olan bir dize, sayı veya boş olmalıdır

  4. Gerçek eserlere yesdönüşen bir script kullanmak ve kullanmakyes

Tartışma

Dokümanlara göre 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 :

çevre

Ortam değişkenleri ekleyin. Bir dizi veya sözlük kullanabilirsiniz. Herhangi bir boole değerleri; doğru, yanlış, evet hayır, YML ayrıştırıcısı tarafından Doğru veya Yanlış'a dönüştürülmemelerini sağlamak için tırnak işaretleri içine alınmaları gerekir.

Yalnızca bir tuşa sahip ortam değişkenleri, Compose'un çalıştığı makine üzerindeki değerlerine, gizli veya ana bilgisayara özgü değerler için yardımcı olabilecek şekilde çözümlenir.

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

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

Soru

Neden izin verilmiyor?


4
DevOps hakkında değil mi? 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 soru güncellendi
030

Yanıtlar:


18

Bu yaklaşık YAML dilinin bir tasarım seçimi gelen Boolean

Bu "regex" ile eşleşen her alıntılanmamış değer:

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

True Veya olarak dönüştürülecek False.

Bu, kodunuzun bir ortam değerini evet veya hayır olarak test edeceği bir soruna yol açar (örneğin, bu betiği alırken ( PR alemindeki diğer örnekler ):

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

Ve oluşturma dosyanızdaki ayar

environment:
  SOME_VAR: yes

Sonuçlanacaktır SOME_VARolmak Truedeğil gibi komut dosyası çalıştırmak, dolayısıyla yanlış davayı çekerken etmek eşit yes.

Bu nedenle, YAML kuralının farkında olmadığınız zamanlarda istenmeyen davranışların hata ayıklanmasını önlemek için boole izin vermeme seçimi yapıldı .

Sorunun üstesinden gelmek için iki yol görüyorum:

  1. Bir kullanma env_filebunun yerine, IIRC ayrıştırılmıyorsa ve dönüşüm önlemelidir.

  2. Daha önce de söylediğiniz gibi, uygulamayı başlatmadan önce değeri tanımlamak için başlatıcınızın etrafında bir sarmalayıcı komut dosyası kullanın; bunun satırındaki bir şey yapmalıdır:

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

9

Bu YAML. trueBir boole olarak yorumlanır . Envarlar karakter dizisi olmalıdır, bu nedenle yazı tipini tırnak yoluyla açık yapma zorunluluğu getirilmelidir.

Bunu https://www.json2yaml.com/ ile test edin


Daha genel olarak, tırnaklar değerde görünmez, çünkü YAML biçimlendirmeleridir.
kodlayıcı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.