의도 : 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 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 |