我正在使用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需要创建一个新的容器,但是有一种方法可以避免再次重新安装所有内容,而仅安装必要的内容?
答案 0 :(得分: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
只会导致重新安装这些要求。