DinD는 docker container 내부에서 docker를 사용하기 위한 기술이다. DinD container를 위해 가장 많이 사용되는 Jpetazzo의 dind image를 활용하는 과정에서 생긴 이슈를 기록하였다.
dind image
Docker image 빌드
dind를 제공하는 이미지를 감싸 새로운 목적에 맞는 docker image를 빌드하고자 한다.
아래는 dind container를 띄우기 위해 만든 dockerfile으로, dind 이미지안에 python을 설치하는 script이다
FROM jpetazzo/dind:latest
RUN apt update
RUN apt-get -y install software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt update
RUN apt-get install -y netcat python3.6-dev python3-pip
RUN apt install -y netcat python3.6
COPY requirements.txt .
RUN python3.6 -m pip install -r requirements.txt
COPY . .
#CMD python3.6 src/run.py
이렇게 빌드했더니 아래 에러가 발생했다.
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
삽질 결과 dind 이미지 내부에 python2,~,python3.4 및 pip3가 이미 설치되어있었고
내가 설치한 python3.6과 함께 pip3 를 사용할 수 없어 생긴 문제였다.
dind 이미지 container내에서 pip3 version 확인 시
root@1017a1f1xxxx:/# pip3 --version
=> 아래와 같이 나온다. pip3가 기존에 설치되어있던 python3.4 와 묶여있었다.
pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.4)
python3.6 버전에 맞는 pip install을 위한 작업을 추가해주었다.
FROM jpetazzo/dind:latest
RUN apt update
RUN apt-get -y install software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt update
RUN apt install -y netcat python3.6
#pip 명령어가 pip3.6용 pip로 인식되도록 파일 다운로드 및 실행
RUN wget https://bootstrap.pypa.io/get-pip.py
RUN python3.6 get-pip.py
#python 명령어가 python2가 아닌 python3.6으로 인식되도록 하기위한 작업
RUN ln -s /usr/bin/python3.6 /usr/local/bin/python
#아래 주석 코드는 필수는 아님
#해당 코드 없이도 pip, pip3, pip3.6 모두 python3.6으로 사용할 수 있었다
#RUN rm /usr/local/bin/pip3
#RUN ln -s /usr/local/bin/pip /usr/local/bin/pip3
COPY requirements.txt .
RUN python3.6 -m pip install -r requirements.txt
COPY . .
#CMD python3.6 src/run.py
최종 코드는 다음과 같다.
FROM jpetazzo/dind:latest
RUN apt update
RUN apt-get -y install software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt update
RUN apt install -y netcat python3.6
RUN wget https://bootstrap.pypa.io/get-pip.py
RUN python3.6 get-pip.py
RUN ln -s /usr/bin/python3.6 /usr/local/bin/python
COPY requirements.txt .
RUN python3.6 -m pip install -r requirements.txt
COPY . .
#CMD python3.6 src/run.py
빌드 후 컨테이너 실행시 python 명령어로 python3.6이 실행되고,
requirements의 package들이 정상적으로 import 되는 것을 확인할 수 있다.
또한 docker 사용도 가능하다.
container 실행
docker daemon 권한때문에 privileged로 실행해야한다.
docker run --privileged -t -i deploy-test:latest
실행 후 python3.6 의 pip version을 확인
root@298e4ab3xxxx:/# python3.6 -m pip --version
=> pip 20.1.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)
'DevOps > Docker' 카테고리의 다른 글
[Docker] private registry 구축 및 사용하기 (0) | 2021.04.08 |
---|