반응형
Docker_python3.7

Docker ubuntu16.04 + python3.7 venv 패키지유지 환경

ubuntu16.04 에 python 3.7 을 venv 로 가상 환경으로 만들어서 필요할 때 마다 pip 로 패키지를 추가하고 컨테이너 종료시에 사라지지 않고, 유지할 수 있는 도커 이미지를 만들어 보자.

도커 커맨드를 잘 이용하면 금방 만들 수 있을 것이라 생각했지만 쉽지 않았다. 특히 pip로 패키지를 설치한 것을 계속 유지하는 부분과 venv 환경으로 작동하게 하는 부분.
마지막으로 jupyter notebook을 필요한 경우 작동할 수 있도록 하였다.

결론부터

바로 이미지를 받아 실행하고자 한다면 다음을 참고한다.
아래 커맨드를 실행하면, 위 구성한 도커 이미지를 받아 컨테이너를 구동하게 된다. 현재 디렉터리에 py37 이라는 venv 폴더가 생성되고 패키지를 유지하도록 된다.

C:\hub\docker_ubuntu16.04-python3.7>type b.bat
docker run -it -v /c/hub/docker_ubuntu16.04-python3.7/py37:/root/py37 crazyj7/ubuntu16.04-python3.7

C:\hub\docker_ubuntu16.04-python3.7>type j.bat
docker run -it -v /c/hub/docker_ubuntu16.04-python3.7/py37:/root/py37 -p 8888:8888 crazyj7/ubuntu16.04-python3.7 jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root --NotebookApp.token='' --NotebookApp.password=''
  • b.bat : python3.7 구성환경 구동하여 bash 쉘 구동. python을 실행할 수 있다.

image
위 쉘에서 pip로 패키지를 추가할 수 있다. 나중에 다시 컨테이너 구성시에도 패키지가 항상 유지(보관)된다.

생성된 py37 폴더에 소스코드를 작성하고 작업 디렉터리로 사용해도 되고, 별도 공유 폴더를 만들어 볼륨을 연결해서 사용해도 된다.
image
종료시에는 ^C를 두 번 입력하면 종료된다.

image

만드는 과정

아래 github에 내가 작성한 소스가 있다.
https://github.com/crazyj7/docker_ubuntu16.04-python3.7

먼저 나의 작업 디렉터리 구조이다.
c:\hub\docker_ubuntu16.04-python3.7

Dockerfile을 만들어 보자.

Dockerfile

FROM ubuntu:16.04
MAINTAINER crazyj7@gmail.com

RUN apt-get update -y
RUN apt-get upgrade -y
#RUN apt-get install -y build-essential binutils libtool make gcc g++ openjdk-8-jdk git dos2unix vim wget
RUN apt-get install -y build-essential wget vim dos2unix
RUN apt-get install -y zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget software-properties-common
RUN apt-get install -y ocl-icd-opencl-dev
RUN add-apt-repository -y ppa:deadsnakes/ppa
RUN apt-get update -y
RUN apt-get install -y python3.7
RUN apt-get install -y python3.7-venv

# env
WORKDIR /root
ENV HOME /root
SHELL ["/bin/bash", "-c"]

ENV PATH "/root/py37/bin:$PATH"
RUN echo "source /root/py37/bin/activate" >> .bashrc

COPY ./requirements.txt /root/requirements.txt
COPY ./initvenv.sh /root/initvenv.sh

ENTRYPOINT ["/bin/bash", "-c", "/root/initvenv.sh \"$@\"", "--"]
VOLUME /root/py37
CMD ["/bin/bash"]
  • 앞에 RUN은 기본 ubuntu 16.04를 베이스로 하여 시스템에 필요한 패키지를 설치한다. 그리고 python 3.7을 설치하였다.
  • 환경 설정 부분에서 작업 디렉터리를 /root로 하고, 기본 쉘을 bash로 변경. 환경 설정 파일들을 추가.
  • bash 구동 스크립트에 /root/py37의 venv를 활성화 시키도록 하였다.
  • 최초 구성할 기본 python 패키지들을 requirements.txt에 몰아 넣어 구축시 설치되도록 하였다.
  • 그리고 entry point로 initvenv.sh 스크립트를 추가하여 항상 구동하게 하였다. 뒤에 파라미터는 cmd로 별도로 파라미터로 줄 경우 쉘로 구동할 수 있도록 받게 하였다.
  • 볼륨은 /root/py37로 공유 연동 가능하도록 설정.

initvenv.sh

#!/bin/bash

ENVNAME=/root/py37
if [ "$(ls -A $ENVNAME)" ]; then
#	echo Env $ENVNAME exists. skip init.
	source $ENVNAME/bin/activate
else
	echo Env $ENVNAME not exists. init env.
	python3.7 -m venv $ENVNAME
	source $ENVNAME/bin/activate
	pip install --upgrade pip
	pip install -r requirements.txt
fi

if [ $# ]; then
	$*
else
	/bin/bash
fi

py37 폴더 존재여부에 따라 최초 초기화 여부를 수행한다. 별도 지정한 cmd가 있으면 cmd를 수행하도록 하였음. (jupyter notebook 등)

도커 빌드
build.bat

docker build -t crazyj7/ubuntu16.04-python3.7 .

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

set에 set 추가? frozenset  (0) 2021.02.24
Jupyter Notebook 소스 복구  (0) 2020.06.16
딕셔너리에서 키삭제  (0) 2019.12.07
파이썬 충돌해결 module conflict  (0) 2019.12.01
파이썬 개발환경/가상환경구축  (0) 2019.12.01

+ Recent posts