我一直在为Docker Build和
--cache-from
在过去的几天里,缺少关于
--从
,而在野外也有一些误传。
我想我终于解决了我这边的问题,我在这里分享了一些见解,希望对其他人有用。
当提供多个
--从
,顺序很重要!
顺序很重要,因为在第一场比赛中,
Docker将停止寻找其他匹配项,它将使用该匹配项执行所有其他命令
.
This is explained by the fellow who implemented the feature in the Github PR
:
当使用multiple--cache from时,将按用户指定的顺序检查缓存命中率。如果其中一个映像对某个命令产生缓存命中,则该映像仅用于生成的其余部分。
还有
a lenghtier explanation in the initial ticket proposal
:
从图像中指定多个缓存有点问题。如果两个图像都匹配,则无法(不执行多次传递)确定要使用的图像。所以我们选择第一个(让用户控制优先级),但这可能不是我们最终可以匹配的最长链。如果我们允许在某些命令中对一个图像进行匹配,然后切换到具有较长链的另一个图像,我们可能会在图像之间泄漏一些信息,因为我们只验证缓存的历史和层。目前我留下了它,所以如果我们得到一个匹配,我们只使用这个目标图像的其余命令。
使用
--从
是独占的:不使用本地Docker缓存
这意味着它不会添加新的缓存源,您提供的图像标记将是Docker构建的唯一缓存源。
即使您只是在本地构建相同的映像,下次运行Docker Build时,为了从缓存中获益,您需要:
-
提供正确的标签
--从
(并具有正确的优先权);或
-
不使用
--从
完全(以便它使用本地生成缓存)
如果父映像更改,缓存将失效
例如,如果您有一个基于
docker:stable
和
Docker:稳定
更新后,图像的缓存生成将不再有效,因为基础图像的层已更改。
这就是为什么,如果要配置CI生成,
it can be useful to
docker pull
the base image as well and include it in the
--cache-from
, as mentioned in this comment in yet another Github discussion
.