로컬 기준(단위 GB) | single stage | multi stage |
---|---|---|
python:3.11 | 2.025 | 1.684 |
python:3.11-slim | 1.537 | 1.196 |
# 사전 스테이지
FROM python:3.11-slim as requirements-stage
WORKDIR /tmp
RUN pip install poetry
COPY ./pyproject.toml ./poetry.lock /tmp/
# requirements.txt 생성
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
# 최종 스테이지
FROM python:3.11-slim
ENV PYTHONUNBUFFERED=1 \\
PYTHONDONTWRITEBYTECODE=1 \\
TZ=Asia/Seoul
WORKDIR /qb
COPY --from=requirements-stage /tmp/requirements.txt /qb/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /qb/requirements.txt
COPY ./env/.env /qb/env/.env
COPY ./app /qb/app
CMD uvicorn app.main:app --host 0.0.0.0 --port 8000
<aside> 💡
변경이 잦은 레이어일 수록 아래쪽에 배치
COPY
하는 단계
</aside>이미지 레이어 다이어그램 예시
RUN
, ADD
, COPY
단계의 레이어는 캐싱되어 다음 빌드에 변경사항이 없다면 재사용 가능
requirements.txt
파일을 생성RUN pip install
단계에서 패키지 설치
<aside> 💡
배포마다 새로운 러너로 이미지 빌드하는 환경에서 레이어 캐싱을 사용하기 위해 build-push-action 사용
</aside>