- CLAUDE.md 정적 카탈로그 규모를 실측치로 교체(차트 59 / 버전 디렉토리 70). 차트 디렉토리 5종 파일이 전부 갖춰지지 않은 곳이 있다는 사실과 dip-* 계열이 선택적이라는 점을 명시해 "5개 필수"로 오해하지 않게 했다. - 디렉토리 트리에 scripts/deploy-test/·images/·MEMORY.md·doc/ 하위 문서를 추가. scripts/build/ 의 "아직 실사용 이미지 없음" 문구는 실제 빌드 이미지가 생겨 더 이상 사실이 아니라 제거했다. - chart-to-cnpg: 남은 전환 대상에서 flowise 제외(2026-08 완료), infisical-standalone 추가. - self-build-image: 이미지 3종 → 7종. 목록이 또 어긋나지 않도록 images/ 디렉토리가 단일 출처임을 설명에 박아뒀다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
3.2 KiB
name, description
| name | description |
|---|---|
| self-build-image | 자체 빌드 하드닝 이미지를 추가하거나 기존 빌드 정의를 변경할 때 사용한다. "이미지 자체 빌드해줘", "하드닝 이미지 추가", "차단 CVE를 자체 빌드로 해소", "build-hardened-image.sh 실행", "images/ 아래 새 이미지" 같은 요청이 해당한다. 현재 adc, apisix, apisix-ingress-controller, cloudnative-pg, cnpg-postgresql, etcd, keycloak 7종이 있다(정확한 목록은 images/ 디렉토리가 단일 출처). |
자체 빌드 하드닝 이미지
CVE 게이트 대응 우선순위(상위 태그 교체 → 베이스 OS 교체 → 자체 빌드 → 예외 승인)에서 앞의 두 단계로 해소가 안 될 때만 온다.
원칙 — 오케스트레이션은 항상 하나다
scripts/build/build-hardened-image.sh 하나가 모든 자체 빌드 이미지를 빌드한다.
OS 패키지 재설치든 소스 컴파일이든 스크립트는 같고, 차이는 전부 images/<image>/ 안에 있다.
"이 이미지는 성격이 다르다"는 이유로 새 오케스트레이션 스크립트를 만들지 않는다 —
절차(빌드 → 기능검증 → SBOM → 스캔 → 게이트 → push)는 이미지 종류와 무관하게 동일하다.
SBOM·스캔·게이트도 다시 만들지 않는다 — build-hardened-image.sh가 이미
scan-sbom.sh/cve-gate.py를 호출한다.
실행
IMAGE=<image> BASE_OS=<variant> bash scripts/build/build-hardened-image.sh /tmp/out
images/<image>/<variant>.build.env가 계약(DOCKERFILE, TARGET, BUILD_ARGS 등)을
선언하면 스크립트는 이미지 종류를 몰라도 된다. 전체 계약표와 신규 이미지 추가 7단계 절차는
.claude/image-authoring.md에 있다 — 여기 복제하지 않는다.
CI는 build-image.yml이 image 입력으로 이미 파라미터화돼 있다. images/<image>/catalog.env만
추가하면 워크플로 수정 없이 태울 수 있다.
실측된 함정
FROM에 쓰는ARG는 첫FROM이전(전역 스코프)에 선언한다. 스테이지 내부에 선언하면 그 스테이지 지역 변수가 되어 이후FROM의 이미지명 해석에 쓰이지 않고 빈 이미지명 에러가 난다.- 게이트 PASS는 "동작한다"를 증명하지 않는다. CVE 스캐너는 런타임 요구사항(오퍼레이터가 자신의 파일 레이아웃에 의존하는 것 등)을 전혀 보지 못한다. 배포 검증을 반드시 한다 — 절차는 .claude/deploy-test-procedure.md.
CoverageProbe가ok인지 확인한다.none이면 findings 0건이 진짜 0건이 아니라 스캐너에 그 배포판 데이터가 없다는 뜻이다(sbom-cve-gateskill 참고).- 롤링 태그를 쓰지 않는다. 같은 앱 버전이라도 베이스 업데이트 결과가 시점마다 달라
태그에 빌드일을 포함한다(예:
1.30.0-security-hardened-20260804).
마무리
카탈로그 values(custom-values.yaml/dip-values.yaml) 태그 갱신은
scripts/build/patch-catalog-tag.py가 한다. 조사·결정 근거는 PR 설명과
MEMORY.md에 남긴다. images/**+manifests/helm/** 변경은 PR로만 반영한다.