当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Docker如何运行piprequirements.txt只有在有变化的情况下?》经验,为你挑选了2个好方法。

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

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



1> helmbert..:

我假设您在构建过程中的某个时刻,您正在使用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"比"ADD"更受欢迎,除非你特别需要"ADD"的行为.
同意@Metropolis.只有当``文件夹包含需要解压缩或需要支持远程URL处理的任何存档时才需要`ADD`.[**{源代码}**](https://github.com/docker/docker/blob/670c8696a29825b23208496bd4d8e88b5faa7773/builder/dispatchers.go#L77)
@Metropolis,您完全正确。感谢您的提示。

2> jrc..:

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

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

例如:

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

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

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有