我对我看到的一些docker缓存行为感到困惑。
首先我做一个docker构建,然后将图像推送到存储库,然后我在本地删除所有的docker数据(我在OSX上的VM中运行docker,所以我销毁并重新创建VM)。然后我将刚刚推送到存储库的图像拉出来。
现在,我对我的代码进行了任何更改,例如在README中添加换行符。当我运行docker build时,没有任何步骤被缓存。它从一开始就逐一运行所有步骤。
当然,我希望任何COPY .
步骤都会失效,因为我已经更新了代码,但即使是之前的步骤也会失效。
为什么会这样?
更新:
这是我的输出(稍微匿名)。
没有命令行参数,当我运行docker build .
Step 1 : FROM 123456.dkr.ecr.us-east-1.amazonaws.com/foo:0.1.1
0.1.1: foo
d89e1bee20d9: Already exists
9e0bc8a71bde: Already exists
27aa681c95e5: Already exists
a3ed95caeb02: Already exists
1f23dc7f328b: Already exists
7c5e36b70451: Already exists
0844dd833da6: Already exists
8017b7feecce: Already exists
0dd824b407cc: Already exists
ecfa07005844: Already exists
697248412260: Already exists
df6663ccf76d: Already exists
Digest: sha256:823221727843f32d1a52879aa57e40e02f4db2b31a2344384fc0307fa85c2b52
Status: Downloaded newer image for 123456.dkr.ecr.us-east-1.amazonaws.com/foo:0.1.1
---> b6b907685beb
Step 2 : RUN curl https://example.com > /file
---> Running in 1f912826e4c8
OK
如果说它为“foo”基本图像“下载了更新的图像”,问题就在哪里?如您所见,此时所有层都已存在。所以很奇怪,它认为它已经下载了一个更新的图像,也许这与为什么以下步骤没有被缓存有关?
答案 0 :(得分:1)
删除VM还会删除从终端中提取和构建的所有图像。这包括缓存的图层。这是预期的行为,因为Docker实际上并未在您的主机(OS X)中运行。 Docker Engine实际上在VM内部运行,您的Docker客户端CLI通过API与Engine通信。将您的VM视为Docker服务器,将CLI视为Docker客户端。因为Docker Engine在VM中运行;删除时,将删除存储在VM中的缓存层,拉出的图像和所有其他数据。