multi-stage build는 하나의 Dockerfile에서 여러 FROM stage를 사용합니다 — 애플리케이션을 (모든 빌드 도구가 있는) 한 stage에서 빌드하고, 최종 산출물만 깨끗하고 최소한인 최종 stage로 복사합니다. 이는 훨씬 더 작고 안전한 프로덕션 image를 생성합니다.
문제: 빌드 도구가 image를 비대하게 만든다
앱을 빌드하려면 빌드 도구(컴파일러, 개발 의존성, SDK)가 필요하지만,
최종 image에는 그것들이 포함되어서는 안 됨:
→ image를 비대하게 만듦(더 큰 크기, 더 느린 배포)
→ 공격 표면을 증가시킴(더 많은 소프트웨어 = 더 많은 취약점)
→ 최종 image에는 빌드된 산출물 + 그 런타임만 원함.
multi-stage build
# STAGE 1: "build" — 모든 빌드 도구가 있음(앱을 컴파일/번들)
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install # 개발 의존성, 빌드 도구 포함
COPY . .
RUN npm run build # /app/dist 생성
# STAGE 2: final — 빌드된 산출물만 있는 깨끗하고 최소한인 image
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html # 빌드 출력만 복사
# → 최종 image에는 빌드 도구도, 개발 의존성도 없음 — nginx + 빌드된 파일만
