[python] Docker가 변경된 경우에만 pip requirements.txt를 실행하는 방법은 무엇입니까?

Dockerfile에는 다음을 설치하는 계층이 있습니다 requirements.txt.

FROM python:2.7
RUN pip install -r requirements.txt

도커 이미지를 빌드하면 이 파일의 변경 사항에 관계없이 전체 프로세스가 실행 됩니다.

pip install -r requirements.txt파일이 변경된 경우 에만 Docker가 실행되도록하려면 어떻게해야 합니까?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))



답변

빌드 프로세스의 어느 시점에서 COPY또는 ADD다음을 사용 하여 전체 애플리케이션을 Docker 이미지에 복사한다고 가정합니다 .

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

문제는 전체 애플리케이션을 이미지에 복사 할 때마다 Docker 빌드 캐시를 무효화한다는 것입니다. 그러면 이후의 모든 빌드 단계에 대한 캐시도 무효화됩니다.

이를 방지하려면 전체 애플리케이션을 이미지에 추가하기 전에 별도의 빌드 단계에서 파일 requirements.txt 복사하는 것이 좋습니다 .

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

요구 사항 파일 자체는 거의 변경되지 않으므로 애플리케이션 코드를 이미지에 추가 할 때까지 캐시 된 레이어를 사용할 수 있습니다.


답변

이것은 Docker의 자체 ” Dockerfile 작성 모범 사례 “에서 직접 언급됩니다 .

컨텍스트와 다른 파일을 사용하는 여러 Dockerfile 단계가있는 경우 한 번에 모두 복사하지 말고 개별적으로 복사하십시오. 이렇게하면 특별히 필요한 파일이 변경된 경우에만 각 단계의 빌드 캐시가 무효화됩니다 (단계가 다시 실행되도록 함).

예를 들면 :

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

COPY를 넣는 경우보다 RUN 단계에 대한 캐시 무효화가 더 적습니다. / tmp /.


답변

또는 라이브러리 설치를 확인하기 위해 “yes”를 입력하지 않고 requirements.txt 파일을 실행하는 더 빠른 방법으로 다음과 같이 다시 작성할 수 있습니다.

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .


답변