Docker &引用;“缓存”;中级码头工人建造
我正在学习使用Docker,我遇到了一个小麻烦。每当我对Dockerfile进行更改时,我都会运行Docker &引用;“缓存”;中级码头工人建造,docker,Docker,我正在学习使用Docker,我遇到了一个小麻烦。每当我对Dockerfile进行更改时,我都会运行docker build-t标记。,该标记会按原样遍历整个Dockerfile。由于项目中的依赖关系,这需要5-6分钟的时间。有时,我运行的命令会导致错误,或者Dockerfile中会出现错误。虽然修复可能需要几秒钟的时间,但我必须重建整个系统,这会降低我的工作效率。编辑Dockerfile后,是否有方法“从上次生成失败的位置继续”?谢谢。这被称为“构建缓存”,它已经是Docker的一项功能。Doc
docker build-t标记。
,该标记会按原样遍历整个Dockerfile。由于项目中的依赖关系,这需要5-6分钟的时间。有时,我运行的命令会导致错误,或者Dockerfile中会出现错误。虽然修复可能需要几秒钟的时间,但我必须重建整个系统,这会降低我的工作效率。编辑Dockerfile后,是否有方法“从上次生成失败的位置继续”?谢谢。这被称为“构建缓存”,它已经是Docker的一项功能。Docker的构建器只会在Docker文件发生更改之前使用缓存。使用COPY或ADD指令时会出现一些边缘情况,这将导致生成缓存无效(因为它会对文件进行哈希运算以确定是否有更改,如果有更改,则会使缓存无效)。这意味着,如果您正在使用COPY foo/foo
,并且您已经更改了该文件,则生成缓存将无效。另外,如果您执行复制/opt/bar/
(意思是,将整个目录复制到某个地方),即使是一些小的更改,如Vim交换文件或Dockerfile更改,也会使缓存无效
在docker build
命令中使用--no cache
调用根本不使用生成缓存的行为
所以基本上,它就在那里,你正在使用它,只是你可能在很早的时候就改变了Dockerfile,或者用一个COPY/ADD指令点击了一个鲜为人知的edge案例,而构建器在这一点之后会使所有内容无效。在你提问之前先回答这个问题,在更改使缓存失效之后,继续使用缓存将非常困难或不可能。也就是说,如果更改第一个Dockerfile行并使生成缓存无效,则基本上不可能在超过该点时使用生成缓存
编辑Dockerfile后,是否有方法“从上次生成失败的位置继续”
否(正如s所解释的)
这就是为什么最佳实践是将Dockerfile从最稳定的命令(永远不需要更改/修改的命令)组织到最具体的命令(可能需要更改很多的命令)
这样,您的修改只会在Dockerfile的最后几行触发构建,而不会再次执行所有操作,因为您更改了前几行中的一行。非常感谢!复制/添加可能是我的问题。我的Dockerfile在我正在复制的目录中,我显然正在更改它。