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. true가 True로 변경되면 문제가 지속됩니다.
  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은 BOOLEAN이 아닌 STRING 유형입니다.

  3. 사용 yes또는 no변수가 결과로 :

    true를 포함하며, 이는 유효하지 않은 유형이며 문자열, 숫자 또는 널이어야합니다

  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 :

환경

환경 변수를 추가하십시오. 배열이나 사전을 사용할 수 있습니다. 모든 부울 값; true, false, yes no는 YML 파서에 의해 True 또는 False로 변환되지 않도록 따옴표로 묶어야합니다.

키만있는 환경 변수는 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 언어의 디자인 선택에서 비롯된 것입니다.

이 "정규식"과 일치하는 인용되지 않은 모든 값 :

 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_VARTrue가 아니므로 스크립트 실행이, 따라서 잘못된 경우 촬영시에 동일 yes.

선택은 그래서 만들어졌다 하는 부울 허용 당신은 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
    

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.