Docker仅在发生更改时如何运行pip requirements.txt?


91

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

1
请发布docker build(和您的Dockerfile)的输出。据推测,这是破坏缓存的构建过程中的较早步骤,导致此步骤运行。
Thomas Orozco 2015年

更新我目前所拥有的OP
Prometheus

1
仅此步骤是没有用的。请发布完整的输出(或至少发布Dockerfile)。
Thomas Orozco 2015年

Answers:


171

我假设在构建过程中的某个时候,您正在使用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...

由于需求文件本身的变化可能很少,因此您可以使用缓存的层,直到将应用程序代码添加到映像中为止。


8
作为一般准则,除非您特别需要的行为,否则我相信它COPY是首选。ADDADD
大都会

2
@Metropolis,您完全正确。感谢您的提示。
helmbert '17

5
同意@Metropolis。ADD仅当<src>文件夹包含需要解压缩或需要支持远程URL处理的任何存档时才需要。{源代码}
Mohsin

44

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

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

例如:

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

与放置COPY相比,导致RUN步骤的缓存失效更少。/ tmp /之前。


0

另外,作为一种更快的方式来运行require.txt文件而无需键入“ yes”来确认库的安装,您可以重写为:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.