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


91

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))

1
docker build(및 귀하의 Dockerfile) 의 출력을 게시하십시오 . 아마도 캐시를 파열하는 빌드 프로세스의 이전 단계로이 단계가 실행될 것입니다.
Thomas Orozco 2015

내가 현재 가지고있는 모든 업데이트 OP
Prometheus

1
이 단계는 유용하지 않습니다. 전체 출력 (또는 최소한 Dockerfile)을 게시하십시오 .
Thomas Orozco 2015

답변:


171

빌드 프로세스의 어느 시점에서 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...

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


8
일반적인 지침으로, 나는 생각 COPY보다 선호되는 ADD특별히의 동작을 필요로하지 않는 ADD.
Metropolis

2
@Metropolis, 당신은 완전히 맞습니다. 힌트 주셔서 감사합니다.
helmbert

5
@Metropolis와 동의합니다. 폴더에 압축을 풀어야하거나 원격 URL 처리를 지원해야하는 아카이브가 포함 된 ADD경우에만 필요합니다 <src>. {source code}
Mohsin

44

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

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

예를 들면 :

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

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


0

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

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.