เหตุใดจึงไม่อนุญาตให้ใช้บูลีนใน 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. หากความจริงเปลี่ยนเป็นจริงปัญหายังคงมีอยู่
  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 มากกว่าบูลีน

  3. การใช้yesหรือnoเป็นตัวแปรผลลัพธ์ใน:

    มีจริงซึ่งเป็นประเภทที่ไม่ถูกต้องมันควรจะเป็นสตริงจำนวนหรือเป็นโมฆะ

  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 :

สิ่งแวดล้อม

เพิ่มตัวแปรสภาพแวดล้อม คุณสามารถใช้อาร์เรย์หรือพจนานุกรม ค่าบูลีนใด ๆ จริง, เท็จ, ใช่ไม่ใช่, จำเป็นต้องอยู่ในเครื่องหมายคำพูดเพื่อให้แน่ใจว่าจะไม่ถูกแปลงเป็นจริงหรือเท็จโดยตัวแยกวิเคราะห์ YML

ตัวแปรสภาพแวดล้อมที่มีเพียงคีย์เท่านั้นที่จะได้รับการแก้ไขเป็นค่าของพวกเขาบนเครื่อง Compose กำลังทำงานซึ่งจะเป็นประโยชน์สำหรับค่าลับหรือโฮสต์เฉพาะ

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

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

คำถาม

ทำไมไม่อนุญาต


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 เกี่ยวกับบูลีน

ทุกค่าที่ไม่มีเครื่องหมายอัญประกาศตรงกับ "regex" นี้:

 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การเป็นเมื่อเรียกใช้สคริปต์เพราะฉะนั้นการกรณีที่ไม่ถูกต้องในขณะที่มันไม่เท่ากับTrueyes

ดังนั้นทางเลือกที่ได้รับการทำที่จะไม่อนุญาตให้บูลเพื่อป้องกันพฤติกรรมที่ไม่พึงประสงค์อย่างหนักเพื่อแก้ปัญหาเมื่อคุณไม่ได้ตระหนักถึงกฎ 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
    

9

นั่นคือ YAML มันตีความtrueว่าเป็นบูลีน Envars ต้องเป็นสตริงดังนั้นความต้องการในการทำให้ชัดเจนผ่านทางเครื่องหมายคำพูด

ทดสอบสิ่งนี้ด้วยhttps://www.json2yaml.com/


โดยทั่วไปแล้วเครื่องหมายคำพูดจะไม่ปรากฏในค่าตัวมันเองเนื่องจากเป็นรูปแบบของ YAML
coderanger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.