什么是悬空图像,什么是未使用的图像?

在docker 文档docker图像修剪中,可以使用-a标志来

删除所有未使用的图像,而不仅仅是悬挂的图像

后来

删除所有悬挂的图像。如果指定了-a,也将删除所有未被任何容器引用的图像。

有人能给我解释一下什么是悬空图像吗?悬空图像和未使用的图像有什么区别?

104966 次浏览

未使用的映像意味着它没有被分配或在容器中使用。例如,当运行docker ps -a时,它将列出所有退出和当前运行的容器。任何显示在任何容器内使用的图像都是“使用过的图像”。

另一方面,晃来晃去的映像只意味着您已经创建了映像的新构建,但它没有被赋予新名称。这样旧的图像就变成了“悬空图像”。那些旧图像是那些没有标记的,并显示“<none>"当你运行docker images时,它的名字。

当运行docker system prune -a时,它将删除未使用的和悬空的图像。因此,容器中使用的任何映像,无论它们是已经退出还是正在运行,都不会受到影响。

docker中的图像由sha256消化引用,通常称为形象标识。该摘要是映像存在于docker主机上所需的全部内容。通常,你会有标签指向这些摘要,例如标签'busybox:latest'当前指向图像id c30178c523…在我的系统上。

多个标记可以指向同一个图像,并且任何标记都可以更改为指向不同的id,例如,当您提取busybox:latest的新副本或构建应用程序映像的新版本时。

晃来晃去的图片是没有标签的图像,也没有指向它们的儿童形象(例如,使用不同版本的FROM busybox:latest的旧图像)。它们之前可能有一个指向它们的标签,后来这个标签改变了。或者它们可能从来没有标记(例如,docker build的输出不包括标记选项)。

只要没有引用旧映像id的容器仍在运行,删除这些容器通常是安全的。保留它们的主要原因是为了构建缓存。

此外,您可能下载了容器(包括已停止的容器)当前未使用的映像。这些图像与悬空图像完全不同,只要你不打算在将来使用它们,或者不介意在需要它们时下载另一个副本,删除它们可能是安全的。

最安全,最简单的方法来清理悬空图像

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Docker映像由多个层组成。悬垂图像,是与任何标记图像没有关系的层。它们不再起作用,而是消耗磁盘空间。

注意:我建议不要在生产环境中使用prune,因为docker system prune -a会删除所有没有被容器引用的图像,这样我们就不能回滚到上一个版本。

要通过添加过滤器标志来列出悬空图像,-f的值为dangling=truedocker images

列出悬挂图像

docker images -f dangling=true

移除悬空图像

docker rmi $(docker images -f dangling=true -q)

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

当我们运行任何cron作业来删除悬垂的东西时,使用上述方法来确保作业成功运行。就像在Jenkins中,如果我们运行一个带有以下命令的自由风格作业,即使机器中不存在悬垂的东西,作业也永远不会失败。

这是最安全、最简单的方法来清除悬浮图像,并收回磁盘空间供使用。

晃来晃去的图片未加标签的映像。下面的命令给出一个悬空图像列表。

docker images --filter "dangling=true"

docker image prune删除所有悬空图像。

未使用的图片是有标签但目前没有被用作容器的图像。将来你可能需要它,也可能不需要。

docker image prune -a删除所有悬空和未使用的图像。

您通常不希望在某个时间之前删除所有未使用的映像。因此,最好是用过滤器去除。

docker image prune -a -f --filter "until=6h"

我看到了用于移除悬垂图像的有用命令(别名),由andyneff提供:

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)'
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)'

第一个 清除所有悬空图像。这对去除中间体很有用 多个构建中留下的映像。第二个是用来移除的 停止容器。这些是我用于日常维护的别名 如果你想删除所有的缓存,你首先要确保 停止并删除所有容器,因为您不能删除 容器正在使用的映像。类似于

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

这将杀死并删除缓存中的所有图像。

晃来晃去的图片是与任何标记图像没有关系的层。它们不再起作用,而是消耗磁盘空间。

未使用的图像是一个未被分配或在容器中使用的映像。

要列出悬挂的图像:

docker images -f dangling=true

 ></a></p>


在图片截图中,“none”名称为悬空图片。
悬空图像仅仅意味着您已经创建了图像的新构建,但是没有给它一个新名称。所以旧的图像就变成了“悬空图像”。这些旧图像是那些没有标记的,并且当你运行docker images时在其名称上显示“”


<p><code>docker system prune -a</code>,它将删除未使用的和悬空的图像。因此,容器中使用的任何映像,无论它们是已经退出还是正在运行,都不会受到影响。</p></div>
                                                                            </div>
                                </div>
                            </div>
                        </div>
                                                <div class=

docker images -aq -f dangling=true | xargs docker rmi -f