Knowhow/Docker

DockerFile로 효율적으로 이미지 빌드하기 (w/ tip)

침닦는수건 2024. 1. 29. 20:50
반응형

DockerFile이 있을 때, 다음과 같이 한줄을 입력하면 도커 이미지를 빌드할 수 있다. 

docker build -t IMAGE_NAME:TAG .

 

여기서 IMAGE_NAME에 해당하는 부분은 말그대로 이미지 입력을 넣으면 되고, TAG 부분에는 버전 관리용으로 사용할 이름을 넣으면 된다. 지정하지 않을 시 :latest 가 기본값으로 들어간다. 

 

Tip. DockerFile을 여러개로 나누어서 사용하는 방법

DockerFile로 이미지를 빌드할 때, 이미지가 무거워질수록 빌드가 부담스러워진다. 한 번만 빌드하고 끝난다면 아무 상관없지만 혹 개발 단계에서 이것저것 여러번 변경하면서 빌드를 시도한다면 빌드 시간이 길어지므로 불편함이 커진다.

 

예를 들어, OpenCV, Ceres 등 묵직한 라이브러리들을 잔뜩 포함하고 있는 도커 파일에서 WORKDIR 지정과 같이 엄청 사소한 단 1줄을 바꿨을 때도 처음부터 다시 빌드해야 한다. 물론 캐시가 있어 완전 처음부터는 아니지만 그래도 불필요한 시간 소모를 계속 반복해야 한다.

 

이런 문제를 해결하기 위해서 많이 쓰이는 방식은 도커 파일을 분리하는 것이다. 

 

베이스용 도커 파일,  스택용 도커 파일을 따로 만들어서 베이스용 도커 파일에는 웬만하면 변경할 일 없는 굵직한 라이브러리, 즉 환경 설정에만 관여하는 내용을 기록해두고, 스택용 도커 파일에는 베이스 위에 자주 변경하고 실험해볼 내용을 기록해두는 것이다. 

 

예를 들어 DockerBaseFile을 만들고 다음 내용들을 설치한 이미지를 만든다.

OpenCV
TBB
Ceres
COLMAP
...

 

그리고 DockerStackFIle를 만든 뒤 다음과 같이 자주 변경될 내용들을 넣어두는 것이다. 

FROM DOCKER_BASE_IMAGE:latest

RUN git clone ~~
RUN cd, mkdir, 
WORKDIR ~~~
RUN wget

 

실제로 사용하는 순서는 다음과 같다.

docker build -t BASE_IMAGE:latest -f ./DockerBaseFile .
docker build -t STACK_IMAGE:latest -f ./DockerStackFile . #don't forget .

 

이런 방식으로 이미지를 생성하면 매 빌드 시도마다 시간을 획기적으로 줄일 수 있다. 

반응형