본문 바로가기

mlops, devops

docker 내 conda 환경이 안맞는 이슈

의도 : tensorflow라는 conda env가 생성되어있음. 이걸 activate 시키고, 해당 콘다 환경에서 gunicorn으로 코드를 실행시키려함

문제 : /bin/bash에서는 (tensorflow)가 뜨면서 activate가 됐다고 확인되는데, gunicorn 실행시 tensorflow conda env에 설치돼있는 모듈이 'no module named' 에러뜸

 

기존 코드 :

Dockerfile

FROM hos101010/python-object-detection

EXPOSE 5000 2222

RUN apt-get -y update
RUN apt-get -y install libgl1-mesa-glx
RUN pip install opencv-python

WORKDIR /workdir
COPY . .

# conda env를 tensorflow로 변경
RUN chmod 755 /etc/profile.d/conda.sh
RUN . /etc/profile.d/conda.sh
RUN echo "conda activate tensorflow" >> ~/.bashrc

# requirements.txt 설치
RUN pip install -r /workdir/requirements.txt
RUN chmod 755 /workdir/init_container.sh
# ENTRYPOINT ["./init_container.sh"]

./init_container.sh를 통한 gunicorn 실행

#!/usr/bin/env bash
service ssh start
 
gunicorn --chdir /src wsgi:app --bind=0.0.0.0:5000 -w 1 --threads 5 --worker-tmp-dir /dev/shm

 

 

실행 시, tensorflow라는 이름의 콘다 환경으로 잘 접속된 걸 확인할 수 있음

하지만 Dockerfile에서 activate 후의 RUN pip install -r /workdir/requirements.txt  도 실행이 안됐음

 

해결 :

STEP 1)

Dockerfile에서 activate 이후 RUN으로 실행한 것들(ex- RUN pip install -r /workdir/requirements.txt)은 해당 콘다 환경에서 실행되지 않음

-> 콘다를 Dockerfile에서 activate한 후, 끝나고 sh파일 내에서 따로  RUN pip install -r /workdir/requirements.txt 를 실행시켜줌

 

Dockerfile

FROM hos101010/python-object-detection

EXPOSE 5000 2222

RUN apt-get -y update
RUN apt-get -y install libgl1-mesa-glx
RUN pip install opencv-python

WORKDIR /workdir
COPY . .

# conda env를 tensorflow로 변경
RUN chmod 755 /etc/profile.d/conda.sh
RUN . /etc/profile.d/conda.sh
RUN echo "conda activate tensorflow" >> ~/.bashrc

# requirements.txt 설치
# RUN pip install -r /workdir/requirements.txt    -> 여기서 실행 X
RUN chmod 755 /workdir/init_container.sh
# ENTRYPOINT ["./init_container.sh"]

./init_container.sh

#!/usr/bin/env bash
service ssh start

pip install -r /workdir/requirements.txt
gunicorn --chdir /src wsgi:app --bind=0.0.0.0:5000 -w 1 --threads 5 --worker-tmp-dir /dev/shm

 

 

STEP 2)

init_container.sh에서 gunicorn 실행 시, base의 gunicorn을 참조하고 있었음

-> 해당 콘다에 설치된 gunicorn을 참조하도록 변경

 

./init_container.sh

#!/usr/bin/env bash
service ssh start

pip install -r /workdir/requirements.txt
/opt/conda/envs/tensorflow/bin/gunicorn --chdir /src wsgi:app --bind=0.0.0.0:5000 -w 1 --threads 5 --worker-tmp-dir /dev/shm

 

결과)

실행 성공

 

+참고)

Dockerfile로 activate를 하는게 아니라, script에 아예 activate 코드를 넣으면 안될까? - restart를 해줘야하기 때문에 Dockerfile 내 삽입

 

 

+) 추가 에러

로컬에서는 잘 동작하지만 Azure App Service에 올리면 /opt/conda/envs/tensorflow/bin/gunicorn이 없다고 뜸. activate가 제대로 되지 않음

 

해결) dockerfile의 activate 해주는 부분 변경

기존 Dockerfile에서 아래의 부분을

RUN chmod 755 /etc/profile.d/conda.sh
RUN . /etc/profile.d/conda.sh
RUN echo "conda activate tensorflow" >> ~/.bashrc

아래로 코드로 변경

ENV PATH /opt/conda/envs/tensorflow/bin:$PATH
RUN /bin/bash -c "source activate tensorflow"
 

 

'mlops, devops' 카테고리의 다른 글

gunicorn worker & thread 설정(2) - 성능 테스트  (0) 2021.12.01
gunicorn의 gevent란?  (0) 2021.12.01
python warning  (0) 2021.11.30
gunicorn thread worker 설정  (0) 2021.11.30
GCP Connection via Cloud Identity-Aware Proxy Failed error  (0) 2021.11.26