#!/usr/bin/env bash # apisix-ingress-controller 이미지 기능 검증 — 호스트에서 bash 로 실행된다 # (build-hardened-image.sh 가 `env TAG=... PLATFORM=... SOURCE_COMMIT=... bash verify.sh` # 형태로 호출한다). # # 최종 베이스가 bci-micro 라 bash/coreutils 가 있다(패키지 매니저만 없음 — # .claude/image-authoring.md). 다만 이 바이너리는 컨트롤러라 실제 기동에는 Kubernetes # API 서버 접속이 필요하다 — 그건 이 스모크 테스트 범위 밖이고 dev 클러스터 배포 검증 # (.claude/deploy-test-procedure.md)이 담당한다. 여기서는 k8s API 없이 확인 가능한 것만 # 본다: 바이너리 존재, 버전 문자열에 pinned commit 반영, --help 정상 종료, 실행 사용자. # # 마지막 줄에 VERIFY-OK 를 출력하면 통과다. build-hardened-image.sh 가 그것으로 판정한다. set -e TAG="${TAG:?TAG 환경변수가 필요하다}" PLATFORM="${PLATFORM:-linux/amd64}" SOURCE_COMMIT="${SOURCE_COMMIT:?SOURCE_COMMIT 환경변수가 필요하다 (build-hardened-image.sh 가 build.env 에서 전달)}" echo "== 실행 사용자 (nonroot, 이미지 메타데이터) ==" USER_CFG="$(docker inspect --format '{{.Config.User}}' "$TAG")" [ "$USER_CFG" = "65532:65532" ] || { echo "FAIL: 이미지 Config.User 가 65532:65532 가 아니다 (실제: $USER_CFG)"; exit 1; } echo " Config.User=$USER_CFG" docker run --rm -i --platform "$PLATFORM" -e SOURCE_COMMIT="$SOURCE_COMMIT" --entrypoint sh "$TAG" <<'GUEST' set -e echo "== 바이너리 탐색 ==" [ -x /app/apisix-ingress-controller ] || { echo "FAIL: /app/apisix-ingress-controller 실행 파일 없음"; exit 1; } echo " /app/apisix-ingress-controller 존재·실행 가능" echo "== 버전 (pinned commit 반영 확인) ==" OUT="$(/app/apisix-ingress-controller version --long)" while IFS= read -r line; do echo " $line"; done </dev/null echo " --help 종료 코드 0" echo "VERIFY-OK" GUEST