在泊坞窗documentation of docker image prune中,可以使用-a标志
删除所有未使用的图片,而不仅仅是悬空图片
以后
删除所有悬空图像。如果指定了-a,则还将删除未被任何容器引用的所有图像。
有人可以向我解释悬挂图像是什么,悬空和未使用图像之间有什么区别?
答案 0 :(得分:86)
未使用的图像表示尚未在容器中分配或使用它。例如,在运行docker ps -a
时,它将列出所有已退出和当前正在运行的容器。显示在任何容器内使用的任何图像都是"使用过的图像"。
另一方面,悬空图像只是意味着您已经创建了图像的新版本,但它没有给出新名称。所以你所拥有的旧图像就成了&#34;悬空图像&#34;。那些旧图像是未标记的图像并显示&#34; <none>
&#34;运行docker images
时的名称。
运行docker system prune -a
时,它会删除未使用和悬空的图像。因此,容器中使用的任何图像,无论是已退出还是当前正在运行,都不会受到影响。
答案 1 :(得分:20)
Docker镜像由多个图层组成。悬空图像是与任何标记图像无关的图层。它们不再用于目的并占用磁盘空间。
通过向-f
添加值为dangling=true
的过滤器标记docker images
来列出悬空图像。
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
这是清除悬空图像并将我们的磁盘空间恢复使用的最安全,最简单的方法。
请注意:docker system prune -a
将删除容器未引用的所有图片,我们无法通过该图片回到之前的版本。在生产而不是创建新图像时,我们使用之前正在工作的先前图像。
答案 2 :(得分:11)
docker中的图像由sha256摘要引用,通常称为图像ID。该摘要是您在docker主机上存在图像所需的全部内容。通常,您将拥有指向这些摘要的标记,例如标签busybox:我的系统上的最新当前指向图像ID c30178c523 ....多个标签可以指向同一图像,并且可以将任何标签更改为指向不同的ID,例如当您提取busybox的新副本时:最新版本或构建应用程序映像的新版本。
悬空图像是没有标签的图像,并且没有指向它们的子图像(例如,使用不同版本的FROM busybox:latest
的旧图像)。他们之前可能有一个标记指向它们,并且该标记后来发生了变化。或者他们可能从未有过标签(例如docker build
的输出而不包括标签选项)。只要没有仍在运行的容器引用旧映像ID,通常可以安全地删除它们。保留它们的主要原因是为了构建缓存目的。
此外,您可能已下载容器当前未使用的图像(包括已停止的容器)。这些与悬挂图像完全不同,只要您不打算将来使用它们,或者在您需要时不要下载其他副本,可以安全删除。
答案 3 :(得分:6)
悬空图像是与任何标记图像都没有关系的图层。它们不再用于目的并且消耗磁盘空间。
未使用的图像是未在容器中分配或使用的图像。
列出悬空图像
docker images -f dangling=true
答案 4 :(得分:1)
悬挂的图像是未标记的图像。以下命令提供了悬空图像的列表。
docker images --filter "dangling=true"
docker image prune
删除所有悬空的图像。
未使用的图像是具有标签但当前未被用作容器的图像。您将来可能会也可能不需要。
docker image prune -a
删除所有悬空和未使用的图像。
通常,您需要一段时间才能删除所有未使用的图像。因此,最好使用过滤器将其删除。
docker image prune -f --filter "until=6h"
答案 5 :(得分:0)
我看到了一些有用的命令(别名),用于删除悬空的图像,这由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)
这将杀死并删除缓存中的所有图像。
答案 6 :(得分:0)