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

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

后来

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

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


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

另一方面,悬垂的图像只意味着您已经创建了图像的新构建,但没有给它一个新名称。所以旧的图像就变成了“悬空图像”。这些旧映像是没有标记的,并且在运行docker映像时在其名称上显示“<none>”。

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

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

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

悬空图像是没有标签的图像,也没有指向它们的子图像(例如,使用不同版本的FROM busybox:latest的旧图像)。它们之前可能有一个指向它们的标签,后来这个标签改变了。或者他们可能从来没有标签(例如,不包括标签选项的docker构建的输出)。

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

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

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

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

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

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

要通过添加过滤器标志来列出悬浮图像,-f的值为悬挂=true,适用于docker图像。

列出悬挂图像

docker images -f dangling=true

移除悬空图像

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

OR

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

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

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

悬垂图像是未标记的图像。下面的命令给出一个悬空图像列表。

docker images --filter "dangling=true"

Docker图像修剪删除所有悬空图像。

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

Docker映像修剪-删除所有悬空的和未使用的映像。

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

删除Docker镜像文件

我看到了有用的命令(别名)删除悬空图像,由andyneff提供:https://forums.docker.com/t/how-to-delete-cache/5753:

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

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

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