이 글은 0 to production-ready: a best-practices process for Docker packaging 을 읽고 제 나름 번역해본 글입니다. 도움이 되길 바랍니다.
FROM python:3.9-slim-buster
COPY . .
RUN pip install .
ENTRYPOINT ["./run-server.sh"]
이러면 일단 돌아는 감
root
로 구동하지 말자!FROM python:3.8-slim-buster
RUN useradd --create-home appuser
USER appuser
WORKDIR /home/appuser
COPY . .
RUN pip install --user .
ENTRYPOINT ["./run-server.sh"]
#!/usr/bin/env bash
#
# Ver 1.
# 브랜치 안 가리고 작업
#
set -euxo pipefail
test.py
docker build -t my_image:latest . # 혹은 이 과정조차 스크립트로
docker push my_image:latest # 이것도 마찬가지
[set -euxo pipefail
이 뭔데?](https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_set_-euxo_pipefail)#!/usr/bin/env bash
#
# Ver 2.
# 브랜치 이름을 기반으로, 태그를 붙여 배포하는 스크립트
#
set -euxo pipefail
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
docker build -t "my_image:$GIT_BRANCH" .
docker push "my_image:$GIT_BRANCH"
이런 식의 작업은 (당연히)실환경에서 잘 도는걸 기대함… 그리고 에러를 잘 볼 수 있게끔 되기를 바람
PYTHONFAULTHANDLER=1
이라는 옵션을 주면, C 코드내에서의 트레이스백까지 같이 받아볼 수 있게 된다:
ENV PYTHONFAULTHANDLER=1
ENTRYPOINT ["python", "program.py"]
조용히 죽는 원인파악에 좋다
matplotlib
의 문제, DB연결 등…예시
pyc
확장자로 컴파일을 한다..pyc
파일이 없다면 초기구동이 느려질 수도 있다.# (보통은 pip에서 한다) 설치한 코드를 컴파일함
RUN python -c "import compileall; \
compileall.compile_path(maxlevels=10)"
# my_package 디렉토리에 코드를 컴파일한다
RUN python -m compileall my_package/
python:3.9-slim-buster
는 Debian Buster 슬림버전을 사용함pandas
, matplotlib
을 포함하고 빌드하면 훨씬 오래걸린다Dockerfile
자체도 필요하고 빌드 스크립트, 환경 등이 필요하다