#!/usr/bin/env bash # cloudnative-pg 오퍼레이터 이미지 기능 검증 — 호스트에서 bash 로 실행된다 # (build-hardened-image.sh 가 `env TAG=... PLATFORM=... SOURCE_COMMIT=... bash verify.sh` # 형태로 호출한다). # # cnpg-postgresql/verify.sh 와 달리 게스트 셸을 쓰지 않는다 — 최종 이미지 베이스가 # gcr.io/distroless/static-debian13:nonroot 라 셸이 아예 없다(`/bin/sh` 없음, 업스트림 # Dockerfile 도 이 사실을 자기 빌더 스테이지 주석에 명시한다). 대신 `--entrypoint /manager` # 로 바이너리를 직접 실행해 검증한다 — 실제 컨트롤러 기동(k8s API 필요)은 이 스모크 # 테스트 범위 밖이며, dev 클러스터 배포 테스트가 담당한다. # # 마지막 줄에 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 에서 전달)}" SHORT_COMMIT="${SOURCE_COMMIT:0:8}" echo "== manager version ==" OUT="$(docker run --rm --platform "$PLATFORM" --entrypoint /manager "$TAG" version)" echo " $OUT" case "$OUT" in *"$SHORT_COMMIT"*) ;; *) echo "FAIL: version 출력에 pinned commit($SHORT_COMMIT) 이 없다 — ldflags 주입 확인 필요"; exit 1 ;; esac echo "== 실행 사용자 (nonroot, 이미지 메타데이터) ==" # 셸이 없어 컨테이너 안에서 id 를 실행할 수 없다 — 이미지가 선언한 기본 User 를 확인한다. # 위 version 실행 자체가 이 기본 사용자로 이미 성공했다(권한 문제였다면 여기까지 오지 못한다). 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" echo "== --help 스모크 (k8s API 없이 도는 유일한 확인 범위) ==" docker run --rm --platform "$PLATFORM" --entrypoint /manager "$TAG" --help >/dev/null echo " /manager --help 종료 코드 0" echo "VERIFY-OK"