로컬 기준(단위 GB) single stage multi stage
python:3.11 2.025 1.684
python:3.11-slim 1.537 1.196

Dockerfile

# 사전 스테이지
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> 💡

변경이 잦은 레이어일 수록 아래쪽에 배치

이미지 레이어 다이어그램 예시

이미지 레이어 다이어그램 예시

멀티스테이지 빌드 → 용량 감축

Github Actions

<aside> 💡

배포마다 새로운 러너로 이미지 빌드하는 환경에서 레이어 캐싱을 사용하기 위해 build-push-action 사용

</aside>