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를 실행하고 동일하면 캐시 데이터를 사용합니다.