Docker只有在发生变化时才能运行pip requirements.txt。

在Dockerfile中,我有一个安装requirements.txt的图层:

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

当我构builddocker镜像时,它将运行整个过程, 而不pipe对此文件所做的任何更改。

如何确保Docker只运行pip install -r requirements.txt如果文件发生了变化?

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

我假设在构build过程中的某个时刻,您正在使用COPYADD将整个应用程序复制到Docker镜像中:

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

问题在于,每次将整个应用程序复制到映像中时,都会使Docker构buildcaching无效。 这也将使所有后续构build步骤的caching失效。

为了防止这种情况,我build议在将整个应用程序添加到映像之前,在独立的构build步骤中复制requirements.txt文件:

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

由于需求文件本身可能只是很less发生变化,因此您可以使用caching层直到将应用程序代码添加到映像中。

这在Docker自己的“ 编写Dockerfiles的最佳实践 ”中直接提到:

如果您有多个使用您的上下文中的不同文件的Dockerfile步骤,请单独复制它们,而不是一次全部复制。 这将确保每个步骤的构buildcaching仅在特定所需文件发生更改时才会失效(强制重新运行该步骤)。

例如:

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

导致RUN步骤中caching失效的次数比放置COPY的次数less。 / tmp /之前。