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 // 도커 이미지 잘 만드는 법
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker-compose란? (작동 구조, yaml 구성) (1) | 2022.08.17 |
---|---|
[Docker] Docker Network 종류 (0) | 2022.08.17 |
[Docker] Docker Volume 3가지 구성 방법 (0) | 2022.08.16 |
[Docker] Dockerfile 빌드 과정, 문법 정리, Docker Layer (0) | 2022.08.16 |
[Docker] Docker, Docker-compose 명령어 (0) | 2022.08.16 |