본문 바로가기
Develop

Python 배포 : Python Image 경량화로 배포 속도 향상시키기(Docker Image)

by hongreat 2023. 4. 4.
728x90

 

Python 으로 서버를 구축하거나 간단한 Application 을 dockerize하는 경우 python 이미지를 사용하여 배포를 하게 되는데, 이때 몇 가지 설정 만으로 배포속도를 향상시킬 수 있다. 이미지 자체를 가벼운 것을 쓴다거나, 빌드 과정에서 무거워 지는 명령어를 남발하는 경우 빌드가 느려질 수 있다.

 

Python 배포 시 docker Image 사용

Image 경량화가 무엇이고 왜 해야하는가?

Image 경량화란 docker build 단계에서 어떠한 변경과 설정을 통해 Image의 용량을 줄여주는 것이다.

그렇다면 왜 이미지를 경량화 해야할까?

  1. 빠른 배포: 이미지가 경량화 되면 용량이 작아서 배포 시간이 줄어들 것이다. 이는 배포 프로세스를 빠르게 만들어 애플리케이션을 더 빠르게 배포할 수 있도록 한다.
  2. 보안성 향상: 경량화된 이미지는 불필요한 패키지나 라이브러리가 제거되어 있기 때문에 보안성이 더욱 향상된다.
  3. 용량 절감: 경량화된 이미지는 용량이 작아서 저장소에서 더 적은 공간을 차지할 것이고, 이는 비용을 줄이는 데 도움이 될 것이다.
  4. 이식성 향상: 경량화된 이미지는 종속성이 적어서 이식성 역시 좋아질 것이다. 이는 서로 다른 환경에서도 애플리케이션을 실행하는데 용이하다고 볼 수 있을 것이다.

 

방법1)가볍게 만들어진 Python 이미지를 사용한다.

Dockerfile 내에 python 이미지를 사용하는 경우 일반적으로 다음과 같이 사용할 수 있다.

 

FROM python:3.10

 

이렇게 빌드하면

 

 

 

약 5개 정도의 서드파티 라이브러리를 install 했을 뿐인데, 152MB 로 빌드된다.

가장 일반적인 python 이미지를 사용한다면 다양한 Python 패키지와 라이브러리를 사용할 수 있다.

여기서 가볍게 만들어진 이미지를 사용하면 쉽게 경량화를 할 수 있다.

 

python 의 경우 

From python:3.10-slim-buster

python:특정버전-slim 이라는 이름으로 빌드하면 가벼운 이미지로 빌드된다.

 

방법2)Multistage build

Multistage build는 Docker 이미지를 경량화 다른 방법이다.

이미지 크기가 큰 애플리케이션을 빌드하는 경우 유용한 방법인데, 여러 개의 스테이지를 이용하여 Docker 이미지를 만들게 된다.

각 스테이지에서 필요한 패키지와 파일만 복사해서 최종 이미지를 만들기 때문에 이미지 크기가 줄어든다.

 

 

Dockerfile 비교

기존에 작성한 Dockerfile은 명령어가 단순하게 순차적으로 동작한다.

FROM python:3.10-slim-buster
MAINTAINER hongreat95@gmail.com

RUN mkdir /slackbot
WORKDIR /slackbot

ADD . /slackbot

# Use Gitsecrets
ARG NOTION
ARG SLACK_APP_TOKEN
ARG SLACK_BOT_TOKEN
ARG SLACK_SIGNING_SECRET
ARG NOTION_reservation
ARG NOTION_lunch

RUN chmod +x setup_env.sh && ./setup_env.sh

RUN pip install --upgrade pip && pip install -r requirements.txt
ENTRYPOINT ["python","main.py"]

 

 

Multistage를 적용한 Dockerfile은 Build 와 Production, 2단계로 구분해서 작성할 수 있다.

 

첫 번째 단계에서는 애플리케이션을 빌드하고 필요한 라이브러리를 설치했고

두 번째 단계에서는 

COPY —from=build

구문으로 첫 번째 단계에서 생성한 빌드 파일만 복사하는 이미지를 생성했다.

# Build stage
FROM python:3.10-slim-buster AS build

RUN mkdir /slackbot
WORKDIR /slackbot

ADD . /slackbot

ARG NOTION
ARG SLACK_APP_TOKEN
ARG SLACK_BOT_TOKEN
ARG SLACK_SIGNING_SECRET
ARG NOTION_reservation
ARG NOTION_lunch

RUN chmod +x setup_env.sh && ./setup_env.sh

RUN pip install --upgrade pip && \\
    pip install --no-cache-dir --target=/install -r requirements.txt

# Production stage
FROM python:3.10-slim-buster AS production

RUN mkdir /slackbot
WORKDIR /slackbot

COPY --from=build /install /usr/local/lib/python3.10/site-packages/
COPY . /slackbot

ENTRYPOINT ["python","main.py"]

 

배포 결과 용량 확인

기존에 152MB 였던 용량이 136MB으로 줄었다.

Install 할 것이 많아지는 애플리케이션 일수록, 이 차이가 꽤나 크게 작용할 것이다.

 

 

 

참고하기 좋은 문서

https://docs.docker.com/build/building/multi-stage/

 

Multi-stage builds

 

docs.docker.com

 

 

 

Dockerfile을 작성하는 것이 조금 더 복잡해졌긴 했지만
애플리케이션 규모가 증가할수록 오히려 간단해지고 읽기 쉬워질 것이다.

다만, 우려되는 점이 있다면 여러 개의 스테이지를 사용하게 되었을 때 이미지 레이어 수가 늘어나므로 캐시가 불가능해질 수 있지 않을까?
관련된 정보가 부족해 조금 자세하게 알아봐야겠다.