해당 내용은 쿠버네티스 교과서 부록의 내용을 참고하여 작성하였습니다.


멀티 스테이지 빌드란

Docker에서 멀티 스테이지 빌드는 여러개의 FROM 명령어를 사용하여 여러개의 이미지를 생성하는 방법입니다. 이를 통해 빌드 프로세스를 단순화하고 이미지 크기를 줄일 수 있습니다.

다음 두 빌드 dockerfile을 비교해보겠습니다.


예시

단일 스테이지 빌드

FROM diamol/golang 

WORKDIR web
COPY index.html .
COPY main.go .

RUN go build -o /web/server
RUN chmod +x /web/server

CMD ["/web/server"]
ENV USER=sixeyed
EXPOSE 80

멀티 스테이지 빌드

FROM diamol/golang AS builder

COPY main.go .
RUN go build -o /server
RUN chmod +x /server

#app
FROM diamol/base

EXPOSE 80
CMD ["/web/server"]
ENV USER="sixeyed"

WORKDIR web
COPY --from=builder /server .
COPY index.html .

둘은 동일한 go로 작성된 웹 서버를 빌드하는 dockerfile입니다. 하지만 두번째 dockerfile은 멀티 스테이지 빌드를 사용하여 빌드 프로세스를 단순화하고 이미지 크기를 줄였습니다. 해당 방법을 통해 대략 5.2GB의 크기였던 기존의 이미지는 260MB 수준으로 줄어들게 됩니다.

처음으로 멀티 스테이지가 적용된 부분은 처음에 FROM diamol/golang AS builder 부분으로 여기에서 빌드를 수행했습니다.

그 다음으로 멀티 스테이지가 적용된 부분은 FROM diamol/base 부분으로 여기에서 빌드가 완성된 실행 파일만을 web 디렉토리에 복사하여 사용했습니다.


결과

Docker의 멀티 스테이지 빌드를 통해 빌드 프로세스를 단순화하고 이미지 크기를 줄일 수 있습니다. 또 불필요한 파일이 제거됐기 때문에 공격 표면이 줄어들어 보안도 강화됐습니다.


2024-03-13
다음 글: 동시성(Concurrency)과 Golang → 카테고리로 돌아가기 ↩