“缓存”中间Docker构建

时间:2016-05-12 00:54:32

标签: docker

我正在学习使用Docker而且我遇到了一个小烦恼。每当我对Dockerfile进行更改时,我都会运行docker build -t tag .,它会遍历整个Dockerfile。由于我的项目中的依赖项,这需要5-6分钟。有时我运行的命令会导致错误,或者Dockerfile中会出错。虽然修复可能需要几秒钟,但我必须重建整个事情,这会降低我的工作效率。编辑Dockerfile后,有没有办法“从构建上次失败的地方继续”?感谢。

2 个答案:

答案 0 :(得分:3)

这称为“构建缓存”,它已经是Docker的一项功能。 Docker的构建器将只使用缓存,直到Dockerfile发生更改。使用COPY或ADD指令时会出现一些边缘情况,这些指令会导致构建缓存失效(因为它会散列文件以确定是否有任何更改,如果是,则使缓存无效)。这意味着如果您使用COPY foo /foo并且您已更改该文件,则构建缓存将失效。此外,如果你执行COPY . /opt/bar/(意思是,将整个目录复制到某个地方),甚至像Vim交换文件或Dockerfile更改这样的小改动都会使缓存无效

--no-cache命令中使用docker build调用完全不使用构建缓存的行为。

所以基本上,它就在那里,并且你正在使用它,只是你可能在很早的时候改变了Dockerfile,或者用COPY / ADD指令击中那个鲜为人知的边缘情况,而构建器使一切都无效在那之后。只是在你问它之前回答这个问题,在更改使缓存失效后继续使用缓存是非常困难或不可能的。这意味着,如果您更改了第一个Dockerfile行并使构建缓存无效,则基本上不可能在该点之后使用构建缓存。

答案 1 :(得分:2)

  

编辑Dockerfile后,有没有办法“从构建上次失败的地方继续”?

否(由L0j1kanswer解释得很好)

这就是为什么最好的做法是将Dockerfile从最稳定的命令(永远不需要更改/修改的命令)组织到最具体的命令(那些可能需要更改的命令)。< / p>

这样,你的修改只会在你的Dockerfile的最后几行触发,而不是再次遍历所有内容,因为你改变了第一行之一。