[Docker] 이미지 크기 최적화: multi stage build

Docker의 가장 큰 장점이자 특징은 경량 컨테이너라는 것이다.
덕분에 작은 단위로 애플리케이션을 패키징해서 빠르게 배포를 처리할 수 있다.

하지만 그냥 생각없이 말아서 쓰다가는 컨테이너가 수백메가, 기가급까지 뛰면서 무거워지고, 컨테이너가 뜨고 내려가는 속도가 느려질 수도 있다.

이런식으로 대충 짰더니만

동작에는 문제가 없지만 이미지 크기가 1.2기가나 먹는다.

이렇게 먹을 필요가 있을까? 없다.

컨테이너의 크기가 커지는 이유에는 이런 것들이 있다.

  1. 애초에 이미지가 큼

  2. 빌드중에 생기는 패키지 설치나, 빌드 부산물



보통 이미지 크기를 최적화할때는 alpine이라는 경량 이미지를 많이 사용한다.
그리고 빌드 부산물은 서빙하기전에 지워주면 좋을텐데... 그걸 완벽히 하기는 또 불편하거나 귀찮은 부분이 존재한다.

그래서 좀 깔끔하게 이 프로세스를 구성하려면 도커파일을 2개 둬서 2개의 빌드를 분리하는게 바람직할 수 있다.

  1. 빌드 작업: 소스코드를 빌드해서 실행용 아티팩트를 export

  2. 서빙 작업: 실행용 아티팩트를 받아서 alpine 등의 경량 이미지에 서빙



이런 여러개의 stage를 분리해서 빌드를 하려면 docker에서 지원하는 multi stage 기능을 사용하는 것이 좋다.




Docker: multi stage build

이 기능은 도커 19.03.0부터 지원된다.

아래와 같이 Dockerfile에 2개 이상의 프로세스를 우겨넣을 수 있다.
첫번째 프로세스는 AS로 build라고 지어줬고, 두번째는 deploy라고 지어줬다.

그럼 COPY에서 --from 태그를 사용해서 스테이지 간에 파일을 주고받을 수 있다.
그리고 마지막에 진행한 프로세스가 최종 이미지의 결과물이 된다.

저대로 빌드를 돌리면

아주 얄쌍해질 것이다.
1.2기가에서 20메가가 되었다.



참조
https://stackoverflow.com/questions/33377022/how-to-copy-files-from-dockerfile-to-host