DevOps/Docker

[Docker] Multi-stage Build (for Python Docker)

yubi5050 2023. 3. 21. 16:22

Multi-Stage Build란?

Docker 17.05에서 도입된 기술로, 이미지의 용량을 줄이기 위한 목적

 

하나의 프로젝트를 만드는 빌드 과정에서, 순수 구동에 필요한 어플리케이션만 최종 추출하여 사용하는 방법

일전에는 Builder Pattern을 활용해 multi-statge와 비슷한 역할을 함

 

Multi-Stage Build 장점

- 이미지 사이즈를 줄일 수 있음

- 도커 이미지가 자주 변경시 빠르게 배포 가능

 

 

Dockerfile 구성 특징

FROM 1 : 빌드용 Base 이미지 (주로 AS builder 로 별칭을 붙임)

FROM 2 : 어플리케이션 구동용 이미지

COPY --from = builder : 실제 어플리케이션을 위한 필요한 파일들만 복사 해온다.

나머지는 일반 Dockerfile 처럼 작성됨

 

 

Python의 Multi-stage Build 특징

일반적으로 소개되는 방법은 다음과 같다.

1. pip install -> 설치된 라이브러리 bin, lib 파일들 이동

2. virtualenv -> 설치된 가상환경을 옮기는 법

3. wheel 등을 통한 패키지화 방법 -> 패키지로 빌드 후 설치

 

참고링크 : https://pythonspeed.com/articles/multi-stage-docker-python/

 

 

Multi-stage 방법 예시 (위 1번 방법)

# Build Server
FROM python:3.11-slim AS builder-image
RUN apt-get update && apt-get install -y --no-install-recommends \
    apt clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV PYTHONUNBUFFERED=1

# Install Packages
COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt # --user 옵션 넣어도 됨!

## Multi staging
# Run Server
FROM python:3.11-slim AS runtime-image

# Set Env (for .env)
ENV SERVICE_TYPE=".production"
COPY ${SERVICE_TYPE}.env ./
RUN export $(cat .env | xargs) # for base env (not in xx.env)

COPY --from=builder-image /usr/local/bin /usr/local/bin
COPY --from=builder-image /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages

WORKDIR /usr/src/app
COPY . .

CMD ["sh", "-c", "uvicorn ${PROJECT_NAME}.asgi:application --host 0.0.0.0 --port ${SERVER_PORT}"]

 

추가) 읽어보면 좋을 링크

- https://jonnung.dev/docker/2020/04/08/optimizing-docker-images/#gsc.tab=0 // 도커 이미지 잘 만드는 법