docker

04. 반복 작업 속에서 docker build 시간이 오래 걸릴 때

식피두 2020. 10. 21. 14:23

서버 애플리케이션을 dockerfile로 정의하면서 개발할 때

개발 과정에서 코드 수정 -> build -> run 과정을 계속 반복하게 된다.

 

이 때 필요 라이브러리들이 설치되는데 시간이 오래걸린다면

생산성이 크게 저하될 수 밖에 없다.

 

이 때,

준비 시간이 오래 걸리는 것들을 모아 base 이미지로 정의하고,

자주 바뀌는 부분에선 base 이미지를 상속 받아 Dockerfile를 정의해서 씀으로써

빌드 시간을 크게 줄일 수 있다.

 

 

base 이미지 예시

FROM nvidia/cuda:10.2-base-ubuntu16.04
MAINTAINER Jein Song <jeinsong200@gmail.com>

ENV PATH /opt/conda/bin:$PATH
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

# etc.
RUN apt-get update \
    && apt-get install -y git \
    && apt-get install -y wget \
    && apt-get install -y python-qt4 \
    && apt-get install -y build-essential 
 
# install conda & libraries 
COPY ./environment.yml /root/environment.yml
COPY ./weights /root/weights

RUN wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh -O ~/anaconda.sh && \
    /bin/bash ~/anaconda.sh -b -p /opt/conda && \
    rm ~/anaconda.sh && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc 

RUN conda env create -f /root/environment.yml

ENV PATH /opt/conda/envs/py36/bin:$PATH 

CMD ["/bin/bash"]

 

위 예시는 별게 없어 보이긴 하지만,

필요에 의해 억지로 conda 환경을 설치해서

environment.yml (python library 설치 목록) 안에 정의된 라이브러리를

모두 설치해야 하는 예시로,

이 과정에서 많은 시간을 잡아먹었기 때문에

미리 베이스 이미지로 정의해 놓기 딱 좋은 케이스였다.

 

이 후에,

sudo docker build -t example:base .

로 정의해 놓고,

 

아래와 같이, 베이스 이미지를 기반으로 필요한 애플리케이션을 정의한다.

FROM example:base
MAINTAINER Jein Song <jeinsong200@gmail.com>

# Environment Variables
ENV GPU_CNT 4

ENV NUM_WORKER_DET 16
ENV NUM_WORKER_HOM 8
ENV NUM_WORKER_TRK 8

ENV BATCH_SIZE_DET 1
ENV BATCH_SIZE_HOM 10

ENV LOG_DIR /root/logs
ENV INPUT_PATH /root/input_data
ENV OUTPUT_PATH /root/output_data

ENV CROP_SIZE 227
ENV CROP_PAD 2
ENV MAX_TRACK_LENGTH 32
ENV LSTM_SIZE 512

ENV RE3_WEIGHT_DIR /root/weights/re3
ENV RETINA_WEIGHT_DIR /root/weights/retinaNet
ENV ATSS_WEIGHT_DIR /root/weights/atss
ENV OD_TYPE atss

# make dirs
RUN mkdir -p /root/logs
RUN mkdir -p /root/input_data
RUN mkdir -p /root/output_data

COPY ./src /root/src

RUN /bin/bash -c "source activate py36"

WORKDIR /root/src
CMD ["./start.sh"]

 

이 후에는 그대로 빌드하여 사용하면 끝,

src 부분을 수정하고 해당 부분만 재빌드하고, 실행하고 하는 과정에 의해서 시간이 굉장히 많이 단축된다.

[Build] sudo docker build -t example:1.0.0 .
[Run] sudo docker run --name example (-d) --gpus all -v /data/data_sample/t1_video/:/root/input_data -v /data/zmt/output_data:/root/output_data -v /data/zmt/logs:/root/logs zmt:1.0.0
[Stop] sudo docker stop example