Docker如何运行pip requirements.txt只有在有变化的情况下?

Pro*_*eus 64 python docker dockerfile

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

FROM python:2.7
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

当我构建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))
Run Code Online (Sandbox Code Playgroud)

hel*_*ert 121

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

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

问题是,每次将整个应用程序复制到映像中时,都会使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...
Run Code Online (Sandbox Code Playgroud)

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

  • 作为一般准则,我相信"COPY"比"ADD"更受欢迎,除非你特别需要"ADD"的行为. (6认同)
  • 同意@Metropolis.只有当`<src>`文件夹包含需要解压缩或需要支持远程URL处理的任何存档时才需要`ADD`.[**{源代码}**](https://github.com/docker/docker/blob/670c8696a29825b23208496bd4d8e88b5faa7773/builder/dispatchers.go#L77) (5认同)
  • @Metropolis,您完全正确。感谢您的提示。 (2认同)

jrc*_*jrc 28

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

如果您有多个使用上下文中不同文件的Dockerfile步骤,请单独复制它们,而不是一次复制它们.这将确保每个步骤的构建缓存仅在特定需要的文件更改时失效(强制重新执行该步骤).

例如:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/
Run Code Online (Sandbox Code Playgroud)

与放置COPY相比,RUN步骤的缓存失效次数更少./ tmp /之前.