Mengapa orang tidak diizinkan menggunakan Boolean di docker-compose.yml?

24

Mendefinisikan boolean dalam file docker-compose.yml:

environment:
  SOME_VAR: true

dan menjalankan docker uphasil dalam:

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

Upaya untuk menyelesaikan masalah

  1. Jika true diubah ke True masalah tetap ada.
  2. Penggunaan 'true'tidak diterima oleh kode itu sendiri ( aplikasi kerangka kerja mulai menggunakan ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=, yaitu salah satu -Dplay.evolutions.db.default.autoApply=trueatau -Dplay.evolutions.db.default.autoApply=falseparameter):

    VAR memiliki tipe STRING daripada BOOLEAN

  3. Menggunakan yesatau nosebagai variabel menghasilkan:

    mengandung true, yang merupakan tipe tidak valid, harus berupa string, angka, atau null

  4. Menggunakan yesdan menggunakan skrip yang berubah yesmenjadi karya nyata

Diskusi

Menurut dokumen 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 :

Lingkungan Hidup

Tambahkan variabel lingkungan. Anda bisa menggunakan array atau kamus. Nilai boolean apa pun; benar, salah, ya tidak, perlu dilampirkan dalam tanda kutip untuk memastikan mereka tidak dikonversi ke Benar atau Salah oleh parser YML.

Variabel lingkungan dengan hanya kunci diselesaikan untuk nilai-nilai mereka pada mesin Compose sedang berjalan, yang dapat membantu untuk nilai-nilai rahasia atau spesifik host.

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

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

Pertanyaan

Mengapa itu tidak diizinkan?

030
sumber
4
Bukan tentang 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 pertanyaan diperbarui
030

Jawaban:

18

Ini berasal dari pilihan desain bahasa YAML tentang boolean

Setiap nilai tanda kutip yang cocok dengan "regex" ini:

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

Akan dikonversi ke True atau False.

Ini mulai menyebabkan masalah ketika kode Anda akan menguji nilai lingkungan menjadi ya atau tidak misalnya mengambil skrip ini (contoh lain dalam diskusinya PR ):

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

Dan pengaturan dalam file penulisan Anda

environment:
  SOME_VAR: yes

Akan menghasilkan SOME_VARmenjadi Trueketika naskah dijalankan, maka mengambil kasus salah karena tidak sama dengan yes.

Jadi pilihan telah dibuat untuk melarang boolean untuk mencegah perilaku yang tidak diinginkan sulit di-debug ketika Anda tidak mengetahui aturan YAML.

Saya melihat dua cara untuk menyelesaikan masalah:

  1. Sebagai env_filegantinya, mereka tidak diuraikan IIRC dan harus mencegah konversi.

  2. Seperti yang sudah Anda katakan, gunakan skrip pembungkus di sekitar peluncur untuk menentukan nilai alih-alih sebelum meluncurkan aplikasi, sesuatu yang harus dilakukan adalah:

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

Itu YAML. Ini diartikan truesebagai boolean. Envars harus berupa string, karenanya persyaratan untuk membuat jenisnya eksplisit melalui tanda kutip.

Uji ini dengan https://www.json2yaml.com/

Assaf Lavie
sumber
Secara umum, tanda kutip tidak akan muncul dalam nilai itu sendiri karena mereka adalah pemformatan YAML.
coderanger