18044210f6
etcd(bitnamilegacy 동결 미러) → etcd.enabled=false + 카탈로그 자체 etcd 차트를 externalEtcd 기본값으로 연결. adc·apisix-ingress-controller·apisix(paasup/apisix) 세 이미지는 SUSE BCI 자체 빌드로 교체 — 전부 벤더 등급만으로는 안 보이던 벤더 하향 등급 CVE(NVD 재평가 시 드러남)가 원인이었다. - images/apisix-ingress-controller: 정적 링크 Go 모듈 취약 버전만 강제 업그레이드 - images/apisix: APISIX-Runtime(WASM·dubbo 등 커스텀 모듈 포함) 전체를 SUSE BCI 위에서 소스로 재현, keycloak-authz 플러그인 오버레이 - images/adc: 업스트림 빌더 스테이지는 그대로 두고 distroless 최종 베이스만 SUSE BCI+nodejs24 로 교체 scripts/build/patch-catalog-tag.py 의 TAG_BLOCK 이 점 구분 중첩 경로를 지원하도록 확장(apisix 서브차트 alias 때문에 필요). 세 이미지 모두 게이트 PASS(실효 CRITICAL/HIGH 0/0)와 배포 검증(테스트 클러스터)을 마쳤다. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
66 lines
3.0 KiB
Docker
66 lines
3.0 KiB
Docker
# adc — 업스트림 ghcr.io/api7/adc:0.29.0 을 대체하는 자체 빌드.
|
|
#
|
|
# 업스트림(libs/tools/src/docker/Dockerfile, 태그 v0.29.0)은 2단계다:
|
|
# FROM node:lts-bookworm-slim AS builder (pnpm+nx 로 main.cjs 하나로 번들)
|
|
# FROM gcr.io/distroless/nodejs24-debian13:nonroot
|
|
# COPY --from=builder main.cjs .
|
|
# builder 스테이지는 정책 대상이 아니므로(.claude/image-authoring.md 원칙 2) 그대로
|
|
# 재현한다 — **바뀌는 건 final 스테이지 베이스 한 줄뿐이다.**
|
|
#
|
|
# 왜 자체 빌드인가 — 0.29.0(2026-08-05 배포, 확인 시점 최신 태그)이 distroless 전환으로
|
|
# 벤더 관점 CRITICAL/HIGH 는 0/0 이지만, 게이트가 max(벤더,NVD) 로 재평가하면 glibc
|
|
# regex/collating 스택오버플로 4건(CVE-2019-1010022/23, CVE-2018-20796, CVE-2019-9192,
|
|
# 전부 libc6)이 실효 CRITICAL/HIGH 로 잡힌다(2026-08-12 실측) — Debian 이 "affected,
|
|
# 수정 버전 없음"으로 영구 고정해둔 벤더 하향 등급 사례다(cnpg-postgresql 과 같은 패턴).
|
|
# SUSE BCI 글리브C 에는 이 4건이 아예 없음을 실측 확인했다(registry.suse.com/bci/
|
|
# bci-base:15.7 + nodejs24 설치 후 SBOM 스캔, 2026-08-12).
|
|
#
|
|
# 업스트림과 다르게 하는 부분 — final 스테이지 베이스만
|
|
# gcr.io/distroless/nodejs24-debian13:nonroot → registry.suse.com/bci/bci-base:15.7
|
|
# + zypper install nodejs24 (같은 Node 메이저 버전 24 로 유지 — SUSE 표준 패키지,
|
|
# distroless 전용 -devel 류가 필요 없다. 업스트림처럼 배포판 무관 패키지 매니저로
|
|
# 설치하는 형태라 openresty-pcre-devel 같은 문제가 없다)
|
|
# /nodejs/bin/node → /usr/bin/node (zypper 가 설치한 실제 경로, 2026-08-12 실측)
|
|
# 애플리케이션 코드(main.cjs 번들)는 업스트림과 100% 동일하다 — 빌더 스테이지를 그대로
|
|
# 재사용하므로 diff 가 최소다.
|
|
|
|
# syntax=docker/dockerfile:1
|
|
|
|
ARG BUILDER_BASE=node:lts-bookworm-slim
|
|
ARG RUNTIME_BASE=registry.suse.com/bci/bci-base:15.7
|
|
|
|
FROM ${BUILDER_BASE} AS builder
|
|
ARG SOURCE_COMMIT
|
|
|
|
ENV PNPM_HOME="/pnpm"
|
|
ENV PATH="$PNPM_HOME/bin:$PATH"
|
|
ENV NX_DAEMON="false"
|
|
RUN corepack enable
|
|
|
|
WORKDIR /build
|
|
|
|
# BuildKit 의 git context 지원 — tarball+checksum 관리 없이 git 자체가 커밋 무결성을 보장한다.
|
|
ADD https://github.com/api7/adc.git#${SOURCE_COMMIT} /build
|
|
|
|
RUN pnpm install nx -g \
|
|
&& pnpm install \
|
|
&& NODE_ENV=production nx build cli
|
|
|
|
FROM ${RUNTIME_BASE} AS final
|
|
ARG NODE_PKG=nodejs24
|
|
|
|
RUN zypper -n install -y ${NODE_PKG} \
|
|
&& zypper -n clean --all
|
|
|
|
COPY --from=builder /build/dist/apps/cli/main.cjs /adc/main.cjs
|
|
|
|
# 업스트림 최종 스테이지는 distroless ":nonroot" 태그로 non-root 를 기본 적용한다 —
|
|
# bci-base 는 그런 태그 변형이 없어 명시적으로 사용자를 만든다.
|
|
RUN groupadd --system --gid 1000 adc \
|
|
&& useradd --system --gid adc --no-create-home --shell /usr/sbin/nologin --uid 1000 adc \
|
|
&& chown -R adc:adc /adc
|
|
|
|
WORKDIR /adc
|
|
USER adc
|
|
ENTRYPOINT ["/usr/bin/node", "main.cjs"]
|