Docker缓存混乱

时间:2016-02-19 23:35:34

标签: docker docker-registry

我对我看到的一些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”基本图像“下载了更新的图像”,问题就在哪里?如您所见,此时所有层都已存在。所以很奇怪,它认为它已经下载了一个更新的图像,也许这与为什么以下步骤没有被缓存有关?

1 个答案:

答案 0 :(得分:1)

删除VM还会删除从终端中提取和构建的所有图像。这包括缓存的图层。这是预期的行为,因为Docker实际上并未在您的主机(OS X)中运行。 Docker Engine实际上在VM内部运行,您的Docker客户端CLI通过API与Engine通信。将您的VM视为Docker服务器,将CLI视为Docker客户端。因为Docker Engine在VM中运行;删除时,将删除存储在VM中的缓存层,拉出的图像和所有其他数据。