Docker, Ubuntu, Nginx, uWsig, Flask 도커빌드시 Troubleshooting
도커파일을 빌드하다가 생긴 문제와 해결을 정리합니다.
잘못된 내용이나 의견있으시면 댓글 부탁 드립니다.
감사합니다.
환경 :
FROM ubuntu:18.04
Python3
virtualenv
Falsk
Nginx
uWSGI
현상 :
Step 35/51 : RUN apt-get install python3-venv ---> Running in 2543cb338dd5 Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: python3.6-venv The following NEW packages will be installed: python3-venv python3.6-venv 0 upgraded, 2 newly installed, 0 to remove and 9 not upgraded. Need to get 7396 B of archives. After this operation, 44.0 kB of additional disk space will be used. Do you want to continue? [Y/n] Abort. The command '/bin/sh -c apt-get install python3-venv' returned a non-zero code: 1
원인:
이유는 설치도중 프롬프트가 뜨면서 추가 입력을 원하는데 도커 빌드 시에는 사람이 입력해줄 수 없기때문인다.
아래와 같이 옵션을 -y 를 주어 해결했다.
해결:
# Dockerfile RUN apt-get install -y python3-venv
현상:
pip 로 설치를 했는데 pip list 로 확인 시 설치 라이브러리가 안보임
원인:
우분투를 포함한 데비안 기반 플랫폼에서는 파이썬2가 기본으로 깔려있어서 파이썬 3를 쓰려면 pip 명령과 pip3 명령으로 잘 분리해야합니다.
추가 설치가 필요하다는 말이죠.
이와 같이 virtualenv도 설치가 필요한데 이미 파이썬3모듈에 하나로 포함되어있습니다.
따라서 아래의 명령을 실행하면 설치됩니다.
해결:
python3 -m venv env_dir_name
현상:
엄청나게 많은 도커 빌드를 시도하다 보면 갑자기 이전 빌드시 잘 진행했던 명령까지 가지도 못하고 갑자기 중간에 이상한 아래와 같은 메시지가 나올때가 있습니다.
그것도 apt-get update 하는데 말이죠…. 이런 경우 정말 당황스럽죠. 바꾼 것도 없는데 말이죠...
Step 3/49 : RUN apt-get update ---> Running in 38a9ded6a424 Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease At least one invalid signature was encountered. Err:2 http://archive.ubuntu.com/ubuntu bionic InRelease At least one invalid signature was encountered. Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease At least one invalid signature was encountered. Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease At least one invalid signature was encountered. Reading package lists... W: GPG error: http://security.ubuntu.com/ubuntu bionic-security InRelease: At least one invalid signature was encountered. E: The repository 'http://security.ubuntu.com/ubuntu bionic-security InRelease' is not signed. W: GPG error: http://archive.ubuntu.com/ubuntu bionic InRelease: At least one invalid signature was encountered. E: The repository 'http://archive.ubuntu.com/ubuntu bionic InRelease' is not signed. W: GPG error: http://archive.ubuntu.com/ubuntu bionic-updates InRelease: At least one invalid signature was encountered. E: The repository 'http://archive.ubuntu.com/ubuntu bionic-updates InRelease' is not signed. W: GPG error: http://archive.ubuntu.com/ubuntu bionic-backports InRelease: At least one invalid signature was encountered. E: The repository 'http://archive.ubuntu.com/ubuntu bionic-backports InRelease' is not signed. The command '/bin/sh -c apt-get update' returned a non-zero code: 100
원인:
이럴때 기존에 작업했다 실패했던 것들을 싹 정리해 줄 필요가 있어서 그런것 같습니다.
해결:
이런 걸 해결해주는 명령어가 있으니
바로 ~~~
docker image prune
그리고
docker container prune
입니다.
위 명령어로 정리해주고 나니까 다시 apt-get 설치는 잘 넘어가고
아까 에러가 발생했던 곳에서 에러가 발생하네요.. ㅠㅠ
현상:
가상환경 virtualenv가 생성안되는 경우
Step 26/49 : RUN python3 -m venv $projectpath/prjenv ---> Running in e8efcf50027e The virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command. apt-get install python3-venv You may need to use sudo with that command. After installing the python3-venv package, recreate your virtual environment. Failing command: ['/var/www/keywordsvc/prjenv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip'] The command '/bin/sh -c python3 -m venv $projectpath/prjenv' returned a non-zero code: 1
원인:
정확지 않지만 apt-get 을 통해 파이썬 모듈을 설치하는 방법이 있으니 이를 이용하라는 것 같습니다.
해결:
제시한 명령어대로 "apt-get install python3-venv” 을 사용하여 해결
현상:
virtualenv 가상환경에 파이썬 패키지가 설치되지 않는 경우
혹은 시스템 전체에 패키지가 설치되는 경우
(두 경우 모두 만든 응용 프로그램에서 사용할 수 없어서 에러가 나는 경우입니다)
원인:
Dockerfile 은 shell script 와 다르기 때문에….
스크립트에서 처럼 순서대로 가상환경을 실행시키고 pip install 한다고 설치가되지 안습니다.
한 명령어 (RUN) 마다 하나의 process로 실행되어 명령어를 실행하기 때문에 다음의 명령어(RUN)에 영향을 주지 않습니다.
따라서 스크립트 처럼 순서대로 나열해놓고 도커를 빌드하면 빌드는 되지만 실제로 가상환경내에 원하는 패키지들이 설치되지 않습니다.
해결방법1 :
하나의 명령어(RUN)에서 “&&” 를 이용하여 가상환경의 실행과 명령어를 동시에 실행 시켜줍니다.
예를 들면 아래와 같습니다.
RUN . venv_dir/bin/activate && pip install numpy
해결방법2:
환경변수와 패스에 가상환경 경로를 잡아주는 방법입니다.
# in Dockerfile ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH"