방법론과 DevOps/Docker

멀티 스테이지 빌드

개발공부개발공부 2025. 5. 15. 15:12

멀티 스테이지 빌드

 멀티 스테이지 빌드(Multi-statge build) 란 도커 파일 내 여러 개의 빌드 단계를 정의하여 이미지를 생성하는 방법입니다.  모두다 알다시피 빌드라는 행위는 애플리케이션이 동작하기 위해 필요한 요소들을 구성합니다( 라이브러리, 런타임, 툴  등등...). 이미지를 빌드 할 때는 이 구성요소들을 구성할 단계를 코드로 정의해야 하죠. 

 하지만 이 모든 단계가 애플리케이션을 실행하기 위해 최소한으로 필요한 것은 아닙니다.  빌드라는 행위는 결국 이미지를 만드는데는 필요하지만, 최종 컨테이너 이미지에는 필요 하지 않은 부분이 존재합니다.

 예를 들어 스프링 프로젝트를 .jar 파일로 빌드한다고 생각해 봤을 때  maven 또는 gradle 같은 빌드 도구와 자바 컴파일러를 통해 빌드가 가능합니다.  이것을 이미지 빌드에서 생각해보면 결국 자바-스프링 프로젝트를 이미지로 빌드 할때는 이미지에  자바 컴파일러와 maven/gradle 등이 포함되어야 합니다.

 하지만 이것을 컨테이너에 실행환경으로 띄울 때를 생각해 보면 이 경우에는 maven/gradle 이나 컴파일러가 필요하지 않습니다. 결국 생성된 이미지 에서는 빌드에서는 필요했지만 컨테이너 실행환경에서는 필요없는 구성을  지속적으로 포함한다고 볼 수 있으며 이러한 최종 컨테이너 이미지에는 필요 없는 환경을 제거할 수 있도록 단계를 나누어 최종 컨테이너 이미지는 실행에만 필요한 구성을 하는 방식이 바로 멀티 스테이지 빌드 방식 입니다.

 

멀티 스테이지 빌드  실습

https://dkkim2318.tistory.com/147

 

도커파일 지시어

도커파일 도커파일은 이전 이미지 빌드 관련 포스트에서 언급 했듯이, 이미지를 빌드하시 위한 용도로 작성된 파일을 의미합니다. https://dkkim2318.tistory.com/146 이미지 빌드이미지를 만드는 방법

dkkim2318.tistory.com

이전 포스트에서 도커파일을 통해  간단한 node.js 이미지를 빌드 했습니다. 이 포스트에서의 빌드 과정은 빌드/실행을 분리하지 않은 싱글 스테이지 빌드 방식 이였습니다.

해당 도커 파일(싱글 스테이지 빌드) 방식으로 빌드한 이미지를 조회해 보면

사이즈 1.36GB의 이미지로 빌드 된 것을 확인할 수 있습니다. 정말 간단히 브라우저 상에서 페이지 하나를 띄우는 예제인 경우지만 사이즈가 그에 비해 많이 큰 것을 확인할 수 있는데, 싱글 스테이지 빌드 방식은 이전 언급했던 대로 빌드/실행 을 분리하지 않기 때문에 최종 생성 이미지에 빌드에만 필요한 요소들이 포함되어 있기 때문입니다. 

 해당 도커 파일을  아래와 같이 멀티 스테이지 빌드 방식으로 변경 해 보게습니다

멀티 스테이지 방식으로 변환한 도커파일을 생성했고 명칭은 Dockerfile.multi로 지정했습니다

이렇게 필드한 이미지를 확인해 보면 

컨테이너 실행만을 위한 구성으로 사이즈 변화를 확인 할 수 있습니다.