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

新手上路,请多包涵

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

原文由 Prometheus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

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

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

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

原文由 helmbert 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

例如:

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

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

原文由 jrc 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题