서버 애플리케이션을 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
'docker' 카테고리의 다른 글
05. docker-compose 환경에서 임시 nginx proxy 구성하기 (0) | 2020.10.21 |
---|---|
03. Docker 이미지 저장 경로 변경법 (0) | 2020.07.29 |
02. Docker-compose, Swarm (0) | 2020.07.29 |
01. Docker 기본 명령어 (0) | 2020.07.29 |