Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker &引用;“缓存”;中级码头工人建造_Docker - Fatal编程技术网

Docker &引用;“缓存”;中级码头工人建造

Docker &引用;“缓存”;中级码头工人建造,docker,Docker,我正在学习使用Docker,我遇到了一个小麻烦。每当我对Dockerfile进行更改时,我都会运行docker build-t标记。,该标记会按原样遍历整个Dockerfile。由于项目中的依赖关系,这需要5-6分钟的时间。有时,我运行的命令会导致错误,或者Dockerfile中会出现错误。虽然修复可能需要几秒钟的时间,但我必须重建整个系统,这会降低我的工作效率。编辑Dockerfile后,是否有方法“从上次生成失败的位置继续”?谢谢。这被称为“构建缓存”,它已经是Docker的一项功能。Doc

我正在学习使用Docker,我遇到了一个小麻烦。每当我对Dockerfile进行更改时,我都会运行
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在我正在复制的目录中,我显然正在更改它。