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"/* .