在Dockerfile中,我有一个安装requirements.txt
的层:
FROM python:2.7
RUN pip install -r requirements.txt
字符串
当我构建Docker镜像时,它会运行整个过程**,而不管**对该文件所做的任何更改。
如何确保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))
型
3条答案
按热度按时间7rfyedvj1#
我假设在构建过程中的某个时刻,您正在使用
COPY
或ADD
将整个应用程序复制到Docker镜像中:字符串
问题是,每次将整个应用程序复制到镜像中时,都会使Docker构建缓存无效。这也会使所有后续构建步骤的该高速缓存无效。
为了防止这种情况,我建议在将整个应用程序添加到映像中之前,在单独的构建步骤中只复制**
requirements.txt
**文件:型
由于需求文件本身可能很少更改,因此在将应用程序代码添加到映像中之前,您将能够使用缓存层。
goqiplq22#
这在Docker自己的“Best practices for writing Dockerfiles“中直接提到:
如果您有多个Dockerfile步骤,使用来自您上下文的不同文件,请单独复制它们,而不是一次全部复制。这将确保每个步骤的构建缓存仅在特定所需文件更改时才会失效(强制重新运行该步骤)。
举例来说:
字符串
与将COPY . /tmp/放在RUN步骤之前相比,
ergxz8rk3#
或者,作为一种更快的方法来运行
requirements.txt
文件,而无需键入“yes”来确认库的安装,您可以重写为:字符串