Python

FastAPI 배포는 보통 Docker로 한대.. ( 1. 패키징 )

qpmi1zm29 2025. 4. 8. 13:29

맨날 까먹는 나날...

앞으로는 짝꼼씩만 적어보겠습니다..

 


 

아무래도 AI관련 프로젝트를 진행하다보면, 참고할 문서들이나 라이브러리들이 python 주류이기 때문에 python을 사용하지 않을 수가 없습니당..

 

자돌이는 모든 것이 새로워서 혼란스러워요..

 

오늘은 배포 할 때 패키징에 대해서 정리하겠숩니다

 


 

 

JVM 위에서 돌아가는 자바는 보통 .jar 나 .war로 하나의 아카이브로 패키징을 합니다.

이 파일을 java 명령어를 통해서 실행하거나, tomcat과 같은 was에서 실행하죠

하나의 파일로 패키징 할 때 build 과정을 거치기 때문에 필요한 외부 모듈들이 해당 파일 안에 존재하게 됩니다. 

그래서 아래 명령어를 실행할 때 진짜 main 함수만 찾아서 실행만 하면 됩니다. 

java -jar testApp.jar

 

 

그런데 파이썬은 하나의 파일로 압축해서 실행하는 방식은 아닙니다.

.py 모듈들과 외부라이브러리들이 하나의 프로젝트 폴더 안에 잘 담겨져 있습니다..

보통 docker를 사용해 실행 명령어까지 포함한 image를 만들어 실행하는 방식이죠.

만들어진 image를 하나의 아카이브 파일로 보면 될 거 같습니다.

 

간력하게 Dockerfile을 만들어 보면 아래와 같습니다.

 

BASE python:3.11-bullseye

WORKDIR /app

COPY requirements.txt

RUN pip install --no-cache-dir -r requirements.txt

COPY ./app /app

CMD ["python", "test.py"]

 

 

  • requirements.txt 에는 해당 모듈을 실행하는데 필요한 외부 라이브러리 들이 작성되어 있습니다. 보통 프로젝트마다 파이썬 가상환경을 만들고 시작하는데 ( venv ) 이때 설치된 라이브러리들은 pip freeze > requirements.txt 로 버전과 함께 파일로 관리가 가능합니다. 
    • 제가 아직 모르는 걸수도 있지만.. boot 같이 라이브러리들 끼리의 호환성을 위해 자동으로 버전을 관리해주는 방법은 없는것 같아요 ㅠ
  • 컨테이너는 내부적으로 여러개의 레이어 층으로 구성되어 있습니다.  그래서 명령어 실행 전에 해당 계층의 파일 상태를 확인하는데요. 위 코드에서 만약 requirements.txt 의 해시코드가 이전 실행과 동일하면 RUN 명령어는 저장된 캐시 데이터를 사용하고 다음 명령으로 넘겨벼립니다. 
    • 파일이 동일하니까 새로운 외부 라이브러리를 설치할 필요가 없다고 판단하는 것이죠.
  • 그럼 /app 폴더는 어떨까요?? /app에 .py 모듈들이 들어있다고 할 때 도커는 COPY 전에 /app 하위 폴더들의 해시코드를 모두 계산하고 이전 값과 다르면 모든 /app 하위 파일들에 COPY를 실행하고 동일하면 캐시 데이터를 사용합니다.