
K8S 환경에서 파이썬 프로젝트를 사용하기 위해 Docker Image를 이용합니다.
소스 코드를 수정하고 이미지를 생성하는 작업을 반복할 때 이미지 생성 시간을 줄이고 싶었습니다.
공식 파이썬 이미지를 베이스 이미지로 사용합니다.
FROM python:3.9
이미지 내에서 작업 경로로 이동합니다.
WORKDIR /app
프로젝트에서 사용할 소스 코드를 이미지내 작업 경로로 이동합니다.
COPY . .
프로젝트 파일 실행을 위한 패키지를 설치합니다.
RUN pip3 install -r requirements.txt
앱 파일을 실행합니다.
CMD ["python", "app.py"]
최종 Dockerfile
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip3 install -r requirements.txt
CMD ["python", "app.py"]
소스 코드를 수정하고 이미지를 새롭게 생성하면서 비효율적인 부분이 있었습니다.
대부분의 소스 코드 수정은 전체 코드의 일부 작동 코드를 수정하는 것으로 끝납니다. 이때 동일한 패키지 사용을 유지하면서 일부 수정된 소스코드를 이용해 도커 이미지를 빌드할 때에도 계속해서 requirements.txt를 새롭게 설치하게 됩니다.
Dockerfile 에서 한 줄의 실행으로 하나의 Image Layer를 생성합니다. 이때 Layer의 변화가 없다면 이전에 빌드한 Image Layer 캐시를 재사용해 빌드 시간을 줄일 수 있습니다. Layer에 변경된 부분이 있다면 다음(아래) Layer 부터 캐시 사용 없이 새롭게 실행하게 됩니다.
Layer에 변화 여부를 판단하는 기준은 기본적으로 Dockerfile의 도커 명령어와 다음 인자의 "문자열"을 기준으로 하지만, "ADD" 와 "COPY" 명령어는 추가 또는 복사되는 내용물의 차이를 확인합니다.
기존 Dockerfile에서는 소스 코드가 수정된 후 소스 코드를 이미지 내로 복사하는 COPY . . 실행에서 부터 캐시된 Layer를 사용할 수 없게되면서 이후에 실행 되는 RUN pip3 install -r requirements.txt 부분이 계속해서 재실행되게 됩니다.
Dockerfiled의 작은 추가와 간단한 순서 변경으로 해당 문제를 해결할 수 있습니다.
초반은 동일하게 설정합니다.
FROM python:3.9
WORKDIR /app
코드 전체를 옮기는 것이 아닌 requirements 파일만 먼저 이동합니다.
COPY requirements.txt .
프로젝트 파일 실행을 위한 패키지를 설치합니다.
RUN pip3 install -r requirements.txt
패키지 설치 후 프로젝트 파일을 복사합니다.
COPY . .
앱 파일을 실행합니다.
CMD ["python", "app.py"]
최종 Dockerfile
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
다음 도커 이미지 빌드 부터 requirements 파일 수정이 없다면 기존에 캐싱된 Layer를 이용해 Image가 빌드되어 이미지 생성 시간을 단축할 수 있습니다.