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

问题描述 投票:0回答:1

我正在使用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需要创建一个新的容器,但有没有办法避免重新安装所有内容,但只安装必要的东西?

python docker pip docker-compose
1个回答
0
投票

在这种情况下,不,没有办法避免重新安装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只会导致重新安装这些要求。

© www.soinside.com 2019 - 2024. All rights reserved.