在正在进行的构建过程中,`docker image prune` 使用什么标准将图像分类为悬挂图像?
During an ongoing build, what is the criteria used by `docker image prune` to classify an image as dangling?
在我的 PC 上,在一个 window 假设正在进行大型 docker 构建(大约 30 层)。当构建正在进行时(假设它已经到达第 20 层),在另一个 window 假设我 运行 docker image prune -a -f
(目标是删除悬空和未使用的图像),然后将正在进行的构建层被视为悬空并被删除导致构建失败?这是确定性行为吗?
docker image prune -a -f
命令将删除所有图像,包括标记图像,而不仅仅是悬挂图像(这是 -a
选项)。该过程中可能存在竞争条件,具体取决于 prune 命令扫描正在使用的图像时构建所在的位置。如果构建当前在 RUN
步骤内并使用图像,则修剪应跳过该图像使用的所有层。
如果您在 prune 命令查找要删除的图像时处于 RUN
步骤之间,它可能会尝试删除在您的构建中用作父图像的图像。如果在删除期间再次使用该图像,则可能会出错。但是,如果该修剪删除了构建预期扩展的父映像,它也可能导致构建错误。
通常我建议不要在您希望清理的图像包括构建中积极使用的图像的地方进行修剪。您将导致构建花费更长的时间,因为下载已删除的图像,并且如果重新创建层而不是重新使用以前构建的缓存层,您可能会导致在注册表和其他节点上使用更多 space 来拉取图像。
对于一个活跃的构建服务器,使用 buildkit 和它内置的垃圾收集是一个更好的选择。垃圾收集查看图层何时被使用而不是最初创建,并且基于图层的大小,因此您可以为映像构建分配特定数量的磁盘。由于 buildkit 在 containerd 而不是直接在 docker 引擎上运行,缓存本身不会与 docker 图像混合,您可以在不影响构建缓存的情况下修剪图像。 my DockerCon presentation.
中有这些垃圾收集选项的示例
在我的 PC 上,在一个 window 假设正在进行大型 docker 构建(大约 30 层)。当构建正在进行时(假设它已经到达第 20 层),在另一个 window 假设我 运行 docker image prune -a -f
(目标是删除悬空和未使用的图像),然后将正在进行的构建层被视为悬空并被删除导致构建失败?这是确定性行为吗?
docker image prune -a -f
命令将删除所有图像,包括标记图像,而不仅仅是悬挂图像(这是 -a
选项)。该过程中可能存在竞争条件,具体取决于 prune 命令扫描正在使用的图像时构建所在的位置。如果构建当前在 RUN
步骤内并使用图像,则修剪应跳过该图像使用的所有层。
如果您在 prune 命令查找要删除的图像时处于 RUN
步骤之间,它可能会尝试删除在您的构建中用作父图像的图像。如果在删除期间再次使用该图像,则可能会出错。但是,如果该修剪删除了构建预期扩展的父映像,它也可能导致构建错误。
通常我建议不要在您希望清理的图像包括构建中积极使用的图像的地方进行修剪。您将导致构建花费更长的时间,因为下载已删除的图像,并且如果重新创建层而不是重新使用以前构建的缓存层,您可能会导致在注册表和其他节点上使用更多 space 来拉取图像。
对于一个活跃的构建服务器,使用 buildkit 和它内置的垃圾收集是一个更好的选择。垃圾收集查看图层何时被使用而不是最初创建,并且基于图层的大小,因此您可以为映像构建分配特定数量的磁盘。由于 buildkit 在 containerd 而不是直接在 docker 引擎上运行,缓存本身不会与 docker 图像混合,您可以在不影响构建缓存的情况下修剪图像。 my DockerCon presentation.
中有这些垃圾收集选项的示例