Docker를 사용한다고 했을 때 자기가 원하는 이미지를 만들 수 있어야, 최소한 이 사람은 Docker를 어느 정도는 사용할 수 있겠구나라고 할 수 있을 것 같다.
Python이나 R 을 사용할 경우 패지키 별 상호 의존성이 있는 경우가 많다. 나중에 가면 이 패키지가 기본인지 아니면 내가 어떤 경로를 통하여 설치했는지 기억이 가물거리게 된다. 물론 Anaconda에서도 가상 환경을 지원해 주고 있기 때문에 이것을 이용해 볼 수도 있겠다. 그렇다고 하더라도 시스템에서 설치하는 프로그램에 따른 종속성도 있으므로 Docker로 구현해 보도록 하겠다.
Docker에서 이미지를 생성하는 것은 어렵지 않다. 빈 폴더에서 Dockerfile 이라는 파일을 만들고, 여기에 적절한 명령어를 입력해 둔다. 잘 구성된 파일이라면 새로운 이미지를 생성할 수 있다.
예전에 apt-cacher-ng를 알게 되었을 때, Docker와 commit 이야기가 나왔었는데, 실제로 해보니 알 것 같다. Docker로 commit 까지 작업을 하는 곳에서는 미러나 캐시 서버가 있어야 확실히 편하다.
Ubuntu에서 Python 을 컴파일하여 설치하는 것을 구현한 것은 다음과 같다. 블로그 가로폭의 문제로 잘려 보일지라도 알아서 잘 설정하면 된다.
- 우선 도커 이미지에서 캐시 서버를 이용할 수 있도록 미리 설정된 apt.conf 파일을 컨테이너 내부의 /etc/apt 폴더에 복사해 둔다.
- Python 파일도 복사한다.
- 나중에 프로그램 설치하는 과정에서 시간대 설정 부분이 나오기 때문에 미리 시간대를 맞추어 둔다.
- 여러 번의 삽질을 통하여 미리 파악한 최소한의 패키지를 설치한다.
- Python을 컴파일 한다.
FROM ubuntu
ADD http://file.welovedoctor.com/share/FILE/PYTHON/apt.conf /etc/apt/
ADD http://file.welovedoctor.com/share/FILE/PYTHON/Python-3.9.6.tgz /tmp
RUN rm -rf /etc/localtime
RUN ln -s /usr/share/zoneinfo/Asia/Seoul/etc/localtime
WORKDIR /tmp
RUN tar -xzf Python-3.9.6.tgz && rm Python-3.9.6.tgz
RUN apt -y update && apt -y upgrade
RUN apt -y install curl build-essential \
libssl-dev libssl-ocaml-dev libbz2-dev libgdbm-dev liblzma-dev \
libffi-dev uuid-dev libzip-dev libzip-ocaml-dev libsqlite3-dev \
libdb-dev tk libreadline-dev tk8.6-dev
WORKDIR /tmp/Python-3.9.6
RUN ./configure --enable-optimizations && make -j 8 && make install