Scarab 현장 테스트 #019 — Docker Compose 구성 변수 탐색 경계
출처: Dev.to
대상:
docker/compose이슈:
docker/compose#13613공개 브랜치: https://github.com/scarab-systems/compose
PR 상태: 아직 열리지 않음
이 필드 테스트는 구성 변수 추출을 둘러싼 Docker Compose 경계에 초점을 맞추었습니다.
Compose가 타입이 지정된 필드 안에 템플릿 값이 들어 있는 구성 파일에서 보간 변수( interpolation variables)를 발견하려고 할 때 문제가 발생했습니다.
예시 형태:
ports:
- host_ip: "${LXKNS_ADDRESS:-127.0.0.1}"
published: "${LXKNS_PORT:-5010}"
config --variables 의 목적은 Compose 파일에서 사용된 변수를 찾아내는 것입니다.
하지만 이 경로에서는 Compose가 아직 보간되지 않은(해석되지 않은) 모델을 로드한 뒤, 의도적으로 템플릿 상태인 필드에 대해 검증을 진행했습니다.
그 결과 다음과 같은 값이
text ${LXKNS_ADDRESS:-127.0.0.1}
보간이 이루어지기 전에 IP 검증에 통과하려다 실패하게 되었습니다.
실패 모드는 다음과 같습니다:
text invalid ip address
이는 포트 파싱 버그가 아니라 다음 요소들 사이의 경계 문제였습니다.
- 변수 발견
- 해석되지 않은 구성 로드
- 보간 시점
- 타입이 지정된 필드 검증
변수 발견은 변수 참조를 찾기 위해 해석되지 않은 모델을 검사해야 합니다.
검증은 모델이 실제 런타임 구성으로 해석될 때 실행되어야 합니다.
두 단계는 동일한 시점에 이루어져서는 안 됩니다.
이 패치는 일반 구성 로드 시 검증은 그대로 유지하되, 변수 추출을 위해 해석되지 않은(보간되지 않은) 모델을 로드할 때만 검증을 건너뛰도록 합니다.
수정 사항은 config --variables 경로와 원격 스택 보간 변수 발견 경로를 업데이트하여, 변수 발견을 위한 해석되지 않은 모델 로드 중에만 검증이 생략되도록 합니다.
회귀 테스트는 템플릿이 적용된 타입드 포트 필드에 대해 추가되었으며, 포함 내용은 다음과 같습니다.
host_ip: "${LXKNS_ADDRESS:-127.0.0.1}"
published: "${LXKNS_PORT:-5010}"
수정 전 회귀 테스트는 다음과 같이 실패했습니다.
text invalid ip address
수정 후:
text go test ./cmd/compose
passed.
text docker buildx bake lint
passed with:
text 0 issues
공개 diff 누수 스캔도 통과했습니다: SDS 잔여물, 로컬 경로, Codex 참조, 교리 참조, 생성된 런타임 아티팩트, 혹은 비공개 진단 내용이 없습니다.
DCO 서명도 포함되어 있습니다.
보기에 작은 수정처럼 보이지만, 경계가 중요한 문제입니다.
구성 도구는 변수 참조를 발견하기 위해 파일을 읽는 시점과 완전히 해석된 런타임 구성을 검증하는 시점을 구분해야 합니다.
두 단계가 서로 뒤섞이면 도구는 템플릿이 아직 보간되지 않은 상태에서도 유효한 템플릿을 거부하게 됩니다.
이는 사용자 입력이 잘못된 것처럼 보이는 버그이지만, 실제 근본 원인은 시점에 있습니다: 값이 최종이 되기 전 단계에서 검증이 이루어지고 있기 때문입니다.
이번 필드 테스트는 문제를 그 경계로 축소하고, 정상적인 검증을 약화시키지 않으면서 이를 해결했습니다.