# 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"]