본문 바로가기
IT/Docker

파이썬 도커 이미지 가볍고 빠르게 빌드하기

by 소소메모 2025. 12. 9.
반응형

파이썬 도커 이미지,
다이어트와 스피드 업! 가장 효율적인 빌드 전략 가이드

파이썬 애플리케이션을 도커로 배포할 때, 빌드 시간이 너무 오래 걸리거나 생성된 이미지의 크기가 기가바이트(GB) 단위로 커지는 경험을 해보셨나요? 비효율적인 도커 이미지는 CI/CD 파이프라인의 병목이 되고, 클라우드 비용을 증가시키는 원인이 됩니다.

오늘은 현업에서 가장 많이 사용되고 검증된 가볍고 빠르게 파이썬 도커 이미지를 빌드하는 5가지 핵심 노하우 를 정리해 드립니다.


1. OS 선택: Alpine 대신 Slim을 추천하는 이유

많은 분들이 이미지 크기를 줄이기 위해 무조건 Alpine Linux를 선택하곤 합니다. 하지만 파이썬 프로젝트에서는 Debian Slim 이미지가 더 효율적일 때가 많습니다.

  • Alpine의 함정: Alpine은 musl libc를 사용합니다. 하지만 파이썬의 많은 패키지(NumPy, Pandas 등)는 glibc 기반의 Wheel(바이너리) 파일을 제공합니다. Alpine에서는 이 패키지들을 소스 코드부터 직접 컴파일해야 하므로, 빌드 시간이 엄청나게 길어지고 결과적으로 빌드 도구 설치로 인해 이미지 크기가 오히려 커질 수 있습니다.
  • Slim의 장점: python:3.9-slim과 같은 이미지는 불필요한 도구는 제거되어 가볍지만, 표준적인 호환성을 유지합니다.

Tip: 특별한 이유가 없다면 기본 베이스 이미지는 python:3.x-slim으로 시작하세요.


2. 도커 레이어 캐시(Layer Cache) 영리하게 활용하기

도커는 Dockerfile의 각 줄을 '레이어'로 저장하고 캐싱합니다. 변경되지 않은 레이어는 다시 빌드하지 않고 재사용합니다. 이 원리를 이용하면 빌드 속도를 획기적으로 줄일 수 있습니다.

 

 

❌ 비효율적인 순서: 소스 코드를 먼저 복사하면, 코드 한 줄만 수정해도 의존성 패키지를 전부 다시 설치해야 합니다.

COPY . .
RUN pip install -r requirements.txt  # 코드가 바뀌면 여기도 캐시가 깨짐!

 

 

⭕ 효율적인 순서: 변경이 적은 requirements.txt를 먼저 복사하여 설치하고, 소스 코드는 나중에 복사합니다.

COPY requirements.txt .
RUN pip install -r requirements.txt  # 코드가 바뀌어도 이 레이어는 캐시됨 (초고속!)
COPY . .

3. 멀티 스테이지 빌드 (Multi-stage Build) 도입

빌드에만 필요한 도구(컴파일러, git 등)가 실행 환경(Runtime)까지 따라올 필요는 없습니다. 멀티 스테이지 빌드는 빌드 공간과 실행 공간을 분리하여 최종 이미지 크기를 극적으로 줄여줍니다.

 
# 1단계: 빌더 (Builder)
FROM python:3.9-slim as builder

WORKDIR /app
COPY requirements.txt .
# 가상환경에 패키지 설치
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
RUN pip install --no-cache-dir -r requirements.txt

# 2단계: 실행 (Runner) - 여기에는 컴파일러 등이 포함되지 않음
FROM python:3.9-slim as runner

WORKDIR /app
# 빌더 단계에서 생성한 가상환경만 복사
COPY --from=builder /opt/venv /opt/venv
COPY . .

ENV PATH="/opt/venv/bin:$PATH"
CMD ["python", "app.py"]

이 방식을 사용하면, 최종 이미지에는 순수하게 파이썬 런타임과 설치된 라이브러리만 남게 되어 매우 가벼워집니다.


4. .dockerignore 파일은 선택이 아닌 필수

COPY . . 명령어를 사용할 때, 불필요한 파일까지 도커 데몬으로 전송되는 것을 막아야 합니다. 이는 빌드 컨텍스트 전송 시간을 줄이고 보안 사고를 예방합니다.

프로젝트 루트에 .dockerignore 파일을 만들고 다음 내용을 추가하세요:

__pycache__
*.pyc
.git
.env        # 보안 정보 유출 방지
venv/       # 로컬 가상환경 복사 방지
.idea/
.vscode/

5. 최신 도구 활용: pip 대신 uv 고려하기

최근 파이썬 생태계에서 가장 핫한 도구인 uv (Rust로 작성된 초고속 패키지 관리자)를 사용하면 의존성 설치 속도를 10배 이상 단축할 수 있습니다. (uv 강추!!!)

FROM python:3.9-slim

# uv 설치 및 패키지 설치
COPY requirements.txt .
RUN pip install uv && \
    uv pip install --system -r requirements.txt
...

대규모 프로젝트일수록 pip 대신 uv를 사용했을 때 빌드 시간 단축 효과가 극적입니다.


요약: 효율적인 파이썬 도커 빌드 체크리스트

  1. Base Image: alpine보다는 slim 태그 사용하기
  2. Caching: COPY requirements.txt를 소스 코드 복사보다 먼저 수행하기
  3. Size: 멀티 스테이지 빌드로 불필요한 빌드 도구 걷어내기
  4. Context: .dockerignore로 쓸데없는 파일 전송 막기
  5. Optimization: pip install 시 --no-cache-dir 옵션 사용하기 (혹은 uv 도입)

이 원칙들만 지켜도 여러분의 파이썬 도커 이미지는 훨씬 더 가볍고, 빌드 파이프라인은 쾌적해질 것입니다. 지금 바로 여러분의 Dockerfile을 점검해 보세요!

반응형

댓글