2016-02-19 72 views
1

我对我看到的一些docker缓存行为感到困惑。Docker缓存混淆

首先我做一个码头构建,然后将镜像推送到一个存储库,然后我在本地删除所有我的码头数据(我在OSX上的一个虚拟机上运行docker,因此我销毁并重新创建VM) 。然后我拉出刚推入存储库的图像。

现在,我对我的代码做了任何改变,例如,在自述文件中添加一个换行符。当我运行docker构建时,没有任何步骤被缓存。它从一开始就逐一运行所有步骤。

当然,我预计任何COPY .步骤都会失效,因为我更新了代码,但是甚至之前的步骤都是无效的。

为什么会发生这种情况?

UPDATE:

这里是我的输出(匿名位)。

有没有命令行参数,这种情况发生的时候我就跑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

您使用的是什么版本的docker? – saada

+0

@saada Docker 1.9.1,我使用的存储库是AWS ECR存储库,如果这有所帮助。 – danny

+0

使用Docker重复您的实验1.10 – saada

回答

1

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

+0

正确的我希望当我删除虚拟机时删除缓存层,但是之后我正在做一个'docker pull',并期待所有需要在那个时候拉取的缓存层。 – danny