什么是悬空图像和什么是未使用图像?


155

docker image prune的docker 文档中,可以使用-a标志来

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

然后

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

有人可以向我解释什么是悬空图像,悬空图像和未使用的图像有什么区别?


docker image prune(不带-a)的功能完全相同
herm

当您在jenkins中使用它时,它将失败,如果我们依赖docker映像缓存,我们将在生产中丢失docker备份。prune不建议在生产中使用
Jinna Balu

Answers:


153

未使用的图像表示尚未在容器中分配或使用它。例如,在运行时docker ps -a-它会列出您所有退出的和当前正在运行的容器。显示在任何容器内使用的任何图像均为“已使用图像”。

另一方面,悬空的图像仅表示您已创建图像的新版本,但未为其指定新名称。因此,您拥有的旧图像成为“悬空图像”。这些旧图像是未加标签的,并<none>在您运行时在其名称上显示“ ” docker images

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


根据文档,在不使用-a的情况下运行docker prune时,仅删除了悬空的映像。-a将确保也删除未使用的图像,对吗?docs.docker.com/engine/reference/commandline/system_prune
赫姆


1
很有意思。因此,容器可以使用悬挂的图像。注意:如果存在使用这些未标记映像的容器,Docker会警告您。
赫尔姆(Herm)

7
docker system prune --all --filter "until=24h"还会保留最新图像
哈里·莫雷诺

1
根据docs.docker.com/engine/reference/commandline/system_prune/…也 docker system prune -a删除了停止的容器。因此,它也应该删除仅与退出的容器关联的图像,对吗?
lfk

41

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

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)中一样,即使计算机中不存在任何悬空的东西,如果我们运行带有beloow commad作业的自由样式作业也不会失败。

这是清理悬空图像并取回磁盘空间以供使用的最安全,最简单的方法。


2
docker image prune呢?文档说:“删除所有悬挂的图像。如果指定-a,还将删除所有容器未引用的所有图像。” docs.docker.com/engine/reference/commandline/image_prune/...
赫姆

2
@herm,从页面底部引用“注意:在修剪删除任何内容之前,系统会提示您进行确认,但不会显示可能删除的内容的列表”。我认为此答案的重点在于,您可以获得一个悬空图像的列表,然后您明确指定要删除该列表,而不是用修剪方法删除所有悬空图像。
bzier

名称和标签为docker imagesno 的图像被悬挂。如何查看尺寸?另外,名称和标签为“ none”的docker images -a图像是中间图像。是否可以删除它们以及如何检查其大小?
可变

17

docker中的图像由sha256摘要引用,通常称为图像ID。该摘要是映像在Docker主机上存在所需要的全部。通常,您将具有指向这些摘要的标签,例如,在我的系统上,标签busybox:latest current指向图像ID c30178c523...。多个标签可以指向同一图像,并且可以将任何标签更改为指向不同的ID,例如,当您拉出busybox:latest的新副本或构建应用程序图像的新版本时。

悬空图像是指没有标签且没有子图像(例如使用的不同版本的旧图像)的图像FROM busybox:latest。他们之前可能有一个指向他们的标签,后来又更改了该标签。或者他们可能从未有过标签(例如,docker build不包含标签选项的输出)。只要没有容器仍在运行且引用旧映像ID的容器,通常就可以安全地删除它们。保留它们的主要原因是出于构建缓存的目的。

此外,您可能已经下载了容器(包括已停止的容器)当前不使用的图像。这些与悬空的图像完全不同,只要您将来不打算使用它们或在需要时不介意下载其他副本,就可以安全地删除它们。


当docker构建正在运行时(在其中创建层和可能的对象以用于将来悬挂的图像的过程),如果我运行docker image prune,则在新窗口中,它将以任何方式影响正在进行的构建吗?
可变

@variable那里可能存在竞争条件,但通常,正在运行的用于构建步骤的容器将导致该图像被标识为正在使用。可能发生的最坏情况是,修剪会引发错误,或者构建会引发错误,您必须重新运行它。我会研究您是否可以限制修剪,以避免当前正在使用的映像,因为成功修剪将导致将来的生成需要再次下载映像。
BMitch

中间图像(在运行时未显示名称/标签的中间图像docker images -a)也称为悬挂图像吗?是否可以通过docker image prune清除它们?
可变

我的环境中不再有它们了(在这里使用buildkit),所以我建议您在实验室环境中尝试一下以了解会发生什么。
BMitch

也就是说,从中间阶段删除未标记的“图像”是毫无意义的,除非您删除最终标记的图像,否则所有层都将在以后的图像中重用,并且无法删除。如果确实删除它们,则会破坏构建缓存,并使所有将来的映像花费更多时间来构建并存储磁盘空间。
BMitch

5

悬空图像是与任何标记图像都没有关系的图层。它们不再用于目的并且消耗磁盘空间。

未使用的图像是未在容器中分配或使用的图像。

列出悬空图像

docker images -f dangling=true

3

悬空图像是未标记图像。以下命令提供了悬空图像列表。

docker images --filter "dangling=true"

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

未使用的图像是具有标签但当前未被用作容器的图像。您将来可能会也可能不需要。

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

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

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


1)docker image prune -a -f --filter "until=6h"还会删除悬空的图像吗?
可变

2)在您的最后一个命令中,您提到docker image prune -f --filter "until=6h"-由于没有-a-那么它将如何删除未使用的图像?
可变

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)

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


0

在图像屏幕快照中,“ none”名称是悬空图像。悬空的图像仅表示您已创建图像的新版本,但未为其指定新名称。因此,您拥有的旧图像成为“悬空图像”。这些旧映像是未标记的映像,在您运行docker映像时其名称上显示“”。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.