“caching”中间docker构build

我正在学习使用Docker,而且我遇到了一些小麻烦。 每当我对Dockerfile进行更改时,都会运行docker docker build -t tag . 它应该通过整个Dockerfile。 这需要5-6分钟,因为我的项目中的依赖关系。 有时我运行的命令会导致错误,或者在Dockerfile中会出现错误。 虽然解决scheme可能需要几秒钟,但我必须重build整个事情,这会降低我的生产力。 在编辑Dockerfile之后,有没有办法“从最后编译失败的地方继续”? 谢谢。

这被称为“构buildcaching”,它已经是Docker的一个特性。 Docker的构build器将只使用caching,直到Dockerfile发生变化。 在使用COPY或ADD指令时,会有一些边缘情况会导致构buildcaching失效(因为它会散列文件以确定是否有更改,如果是,则使caching无效)。 这意味着如果你正在使用COPY foo /foo并且你已经改变了这个文件,构buildcaching将会失效。 另外,如果你做COPY . /opt/bar/ COPY . /opt/bar/ (意思是将整个目录复制到某个地方), 甚至像Vim交换文件或Dockerfile更改这样的小改动都会使caching失效

完全不使用构buildcaching的行为在docker build命令中使用--no-cache来调用。

所以基本上,它就在那里,而且你正在使用它,只是你可能在很早的时候改变了Dockerfile或者用COPY / ADD指令来触发这个鲜为人知的边缘案例,而且构build器在这个点之后使所有的东西无效。 在提出这个问题之前,只要回答这个问题,在更改使caching失效后,继续使用caching将是非常困难或不可能的。 这意味着,如果你改变你的第一个Dockerfile行并且使构buildcaching失效,那么使用构buildcaching基本上是不可能的。

在编辑Dockerfile之后,有没有办法“从最后编译失败的地方继续”?

没有(因为L0j1k的答案很好解释)

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

这样,你的修改将触发Dockerfile的最后几行的构build,而不是再次通过一切,因为你改变了第一行。