在正在进行的构建过程中,“docker image prune”使用什么标准来将图像分类为悬挂?

在正在进行的构建过程中,“docker image prune”使用什么标准来将图像分类为悬挂?,docker,docker-image,Docker,Docker Image,在我的电脑上,在一个窗口中,假设正在进行大型docker构建(大约30层)。当构建正在进行时(假设它已到达第20层),在另一个窗口中,假设我运行docker image prune-a-f(目标是删除悬空和未使用的图像),那么正在进行的构建层是否会被视为悬空并被删除,从而导致构建失败?这是确定性行为吗?docker image prune-a-f命令将删除所有图像,包括标记的图像,而不仅仅是悬挂的图像(这是-a选项)。根据prune命令扫描正在使用的图像时构建所在的位置,该过程中可能存在争用情况

在我的电脑上,在一个窗口中,假设正在进行大型docker构建(大约30层)。当构建正在进行时(假设它已到达第20层),在另一个窗口中,假设我运行
docker image prune-a-f
(目标是删除悬空和未使用的图像),那么正在进行的构建层是否会被视为悬空并被删除,从而导致构建失败?这是确定性行为吗?

docker image prune-a-f命令将删除所有图像,包括标记的图像,而不仅仅是悬挂的图像(这是
-a
选项)。根据prune命令扫描正在使用的图像时构建所在的位置,该过程中可能存在争用情况。如果构建当前位于
运行
步骤中并使用图像,则修剪应跳过该图像使用的所有层

当prune命令查找要删除的图像时,如果在
运行
步骤之间,它可能会尝试删除用作生成中父级的图像。如果在删除过程中,该图像再次被使用,则可能会导致修剪错误。但是,如果该修剪删除了构建预期扩展的父映像,则也可能导致构建中出现错误

通常,我建议不要进行修剪,因为您希望清理的图像将包括那些在构建中积极使用的图像。下载已删除的映像时,您将导致生成花费更长的时间,如果重新创建层而不是重用以前生成中的缓存层,则可能会导致在注册表和其他提取映像的节点上使用更多的空间


对于活动构建服务器,将buildkit与内置的垃圾收集一起使用是一个更好的选择。垃圾收集查看层是何时使用的而不是最初创建的,它基于层的大小,因此您可以为映像构建分配特定数量的磁盘。由于buildkit在containerd上运行,而不是直接在docker引擎上运行,因此缓存本身不会与docker映像混合,您可以在不影响构建缓存的情况下修剪映像。中有一个垃圾收集选项的示例。

为什么没有关于此场景的官方文档来了解最终会发生什么?@variable文档对PR开放。我从未见过有人问过这个问题,所以我不确定花时间记录是否有意义。