Dockerfile 내에서 가상환경을 생성하고 가상환경을 활성화시킨 다음 무언가를 하기 위해선 약간의 트릭(?)이 필요하다.
base 라는 이름의 pyenv virtualenv를 생성하고, 그 안에 패키지를 설치하는 Dockerfile 예제를 살펴보자.
# syntax=docker/dockerfile:1
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
# change shell
SHELL ["/bin/bash", "-ic"]
# install pyenv, virtualenv
...
# create environment: base
RUN pyenv virtualenv 3.8.16 base && \
pyenv activate base && \
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 && \
. /opt/docker/context/package/install_jupyter.sh
# set entrypoint, cmd
...
여기 2가지 포인트가 있다.
-
기본 shell을 변경해야한다.
초기 shell은sh로 설정되어 있기 때문에,RUN이후의 명령어들은 모두sh ...와 같은 명령어로 실행된다.
이를/bin/bash -ic로 변경하면.bashrc의 설정들을 사용할 수 있다.(PYENV_PATH등)
그리고 각각의RUN명령어들을 하나로 이어(&&) 중간에 shell이 종료되지 않고 순차적으로 실행될 수 있도록 해야한다. -
Shell script를 실행할 때는
.(comma)를 붙여준다.
Shell script를 실행할 때 앞에 있는.는source와 같은 의미를 가진다.
즉,. install.sh와source install.sh는 동일한 작업을 수행하며, 해당 script를 현재 shell에source하는 것을 의미한다.
따라서, 현재 activate한 가상환경이 유지된 상태로 script의 내용들을 실행할 수 있다.
여기선 pyenv를 사용하여 가상환경을 만들었지만, anaconda나 다른 툴들도 마찬가지로 동일한 방식으로 Dockerfile에서 가상환경을 사용할 수 있다.
PREVIOUSEtc