Tại sao người ta không được phép sử dụng Boolean trong docker-compose.yml?


24

Xác định boolean trong tệp docker-compose.yml:

environment:
  SOME_VAR: true

và chạy docker upkết quả trong:

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

Nỗ lực giải quyết vấn đề

  1. Nếu đúng được đổi thành Đúng thì vấn đề vẫn tồn tại.
  2. Việc sử dụng 'true'không được chấp nhận bởi chính mã ( một ứng dụng khung chơi được bắt đầu bằng cách sử dụng ./target/universal/stage/bin/APPNAME -Dplay.evolutions.db.default.autoApply=, tức là -Dplay.evolutions.db.default.autoApply=truehoặc -Dplay.evolutions.db.default.autoApply=falsetham số):

    VAR có kiểu CHUINGI chứ không phải BOOLESE

  3. Sử dụng yeshoặc nolàm biến số dẫn đến:

    chứa true, là loại không hợp lệ, nó phải là một chuỗi, số hoặc null

  4. Sử dụng yesvà sử dụng tập lệnh chuyển đổi yesthành tác phẩm thực sự

Thảo luận

Theo các tài liệu 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 :

Môi trường

Thêm các biến môi trường. Bạn có thể sử dụng một mảng hoặc một từ điển. Bất kỳ giá trị boolean; đúng, sai, có không, cần được đặt trong dấu ngoặc kép để đảm bảo chúng không được chuyển đổi thành Đúng hoặc Sai bởi trình phân tích cú pháp YML.

Các biến môi trường chỉ có một khóa được phân giải thành các giá trị của chúng trên máy Compose đang chạy, điều này có thể hữu ích cho các giá trị bí mật hoặc máy chủ lưu trữ.

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

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

Câu hỏi

Tại sao nó không được phép?


4
Không phải về 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 câu hỏi được cập nhật
030

Câu trả lời:


18

Điều này đến từ sự lựa chọn thiết kế ngôn ngữ YAML về booleans

Mọi giá trị không được trích dẫn phù hợp với "regex" này:

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

Sẽ được chuyển đổi thành True hoặc False.

Điều này bắt đầu gây ra vấn đề khi mã của bạn sẽ kiểm tra giá trị môi trường là có hoặc không, ví dụ như lấy tập lệnh này (ví dụ khác trong phần giải thích PR ):

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

Và thiết lập trong tập tin soạn thảo của bạn

environment:
  SOME_VAR: yes

Sẽ cho kết quả SOME_VARTruekhi kịch bản chạy, do đó lấy trường hợp sai vì nó không phải là tương đương với yes.

Vì vậy, lựa chọn đã được đưa ra để không cho phép boolean để ngăn chặn các hành vi không mong muốn khó gỡ lỗi khi bạn không biết về quy tắc YAML.

Tôi thấy hai cách để khắc phục vấn đề:

  1. Sử dụng env_filethay thế, chúng không được phân tích cú pháp IIRC và sẽ ngăn chặn chuyển đổi.

  2. Như bạn đã nói, sử dụng tập lệnh trình bao quanh trình khởi chạy của bạn để xác định giá trị thay vì trước khi khởi chạy ứng dụng, một số thứ trong dòng này sẽ làm:

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

9

Đó là YAML. Nó diễn giải truenhư một boolean. Envars phải là chuỗi, do đó yêu cầu phải làm cho loại rõ ràng thông qua dấu ngoặc kép.

Kiểm tra điều này với https://www.json2yaml.com/


Nói chung, các trích dẫn sẽ không xuất hiện trong chính giá trị vì chúng là định dạng YAML.
coderanger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.