Backend
Docker 멀티스테이지 빌드 최적화 가이드
멀티스테이지 빌드로 이미지 크기, 보안, 빌드 속도를 동시에 개선하는 실전 기준을 정리합니다.
Docker 멀티스테이지 빌드 최적화 가이드
목표
멀티스테이지의 목적은 단순히 이미지 크기 축소가 아닙니다.
- 런타임 공격 표면 축소
- 빌드 캐시 효율 개선
- 배포 속도/일관성 향상
기본 패턴
FROM golang:1.23 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/server ./cmd/server
FROM gcr.io/distroless/static-debian12
COPY --from=builder /out/server /server
USER nonroot:nonroot
ENTRYPOINT ["/server"]
핵심은 "빌드 도구를 런타임 이미지에 남기지 않는 것"입니다.
캐시 최적화 규칙
- 의존성 파일(
go.mod,package-lock) 먼저 복사 - 소스 복사는 그 다음
--mount=type=cache로 패키지 캐시 활용
베이스 이미지 선택 기준
scratch: 정적 바이너리 가능할 때distroless: 보안 우선, 셸 불필요할 때alpine/slim: 디버깅/호환성 필요할 때
자주 하는 실수
- 런타임 이미지에 빌드 도구/소스코드 포함
latest태그 고정으로 재현성 저하- 멀티스테이지인데도 불필요한 파일 복사
요약
좋은 Dockerfile은 "작다"보다 "예측 가능하고 안전하다"가 기준입니다. 멀티스테이지 + 캐시 순서 + 최소 런타임 이미지를 기본 규칙으로 두는 것이 가장 효과적입니다.