在Dockerfile中我有一个安装层requirements.txt
:
FROM python:2.7 RUN pip install -r requirements.txt
当我构建docker镜像时,无论对此文件所做的任何更改,它都会运行整个过程.
如何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))
helmbert.. 121
我假设您在构建过程中的某个时刻,您正在使用COPY
或将整个应用程序复制到Docker镜像中ADD
:
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...
由于需求文件本身可能很少更改,因此您可以使用缓存层,直到将应用程序代码添加到映像中为止.
我假设您在构建过程中的某个时刻,您正在使用COPY
或将整个应用程序复制到Docker镜像中ADD
:
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自己的" 编写Dockerfiles的最佳实践 "中直接提到:
如果您有多个使用上下文中不同文件的Dockerfile步骤,请单独复制它们,而不是一次复制它们.这将确保每个步骤的构建缓存仅在特定需要的文件更改时失效(强制重新执行该步骤).
例如:
COPY requirements.txt /tmp/ RUN pip install --requirement /tmp/requirements.txt COPY . /tmp/与放置COPY相比,RUN步骤的缓存失效次数更少./ tmp /之前.