我正在使用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
只会导致重新安装这些要求。