Docker和pip安装:避免在已安装某些软件包时安装所有软件包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker和pip安装:避免在已安装某些软件包时安装所有软件包相关的知识,希望对你有一定的参考价值。

我正在使用docker compose来构建Python项目的堆栈。这是一个处理要求的dockerfile片段。

# Requirements are installed here to ensure they will be cached.
COPY ./requirements /requirements
RUN pip install --no-cache-dir -r /requirements/production.txt 
    && rm -rf /requirements

使用该配置,我可以缓存需求,但是当我修改production.txt(例如更新甚至单个软件包)时,Docker会重新安装所有内容。

我知道Docker需要创建一个新的容器,但有没有办法避免重新安装所有内容,但只安装必要的东西?

答案

在这种情况下,不,没有办法避免重新安装production.txt中的所有内容。

来自official docs,在Leverage build cache部分:

对于ADD和COPY指令,将检查映像中文件的内容,并为每个文件计算校验和。在这些校验和中不考虑文件的最后修改时间和最后访问时间。在高速缓存查找期间,将校验和与现有映像中的校验和进行比较。如果文件中的任何内容(例如内容和元数据)发生了任何更改,则缓存将失效

由于您更改了production.txt,因此缓存无效并且docker从先前有效的层启动并安装所有内容。

现在,如果您有多个requirements.txt文件,您可以通过执行单独的复制和安装步骤来利用一些缓存:

COPY requirements1.txt
RUN pip install --no-cache-dir -r requirements1.txt

COPY requirements2.txt
RUN pip install --no-cache-dir -r requirements2.txt

这可能有其他缺点,但它可以让你通过在requirements1.txt中放置不太可能更新的长寿命包和requirements2.txt中不太稳定的包来部分减少重新安装时间。然后更改requirements2.txt只会导致重新安装这些要求。

以上是关于Docker和pip安装:避免在已安装某些软件包时安装所有软件包的主要内容,如果未能解决你的问题,请参考以下文章

无法使用pip安装某些python软件包

Microsoft Visual C ++ 14.0需要在已安装Visual Studio 2017的地方安装

如何在 Ubuntu 上通过 pip 安装 python3 版本的软件包?

如何在 Ubuntu 上通过 pip 安装 python3 版本的软件包?

无法在python中导入beautifulsoup

pip Command Not Found – Mac 和 Linux 错误被解决