小编典典

如何删除旧的和未使用的 Docker 镜像

all

长期运行 Docker 时,系统中有很多镜像。如何一次安全地删除所有未使用的 Docker 映像以释放存储空间?

此外,我还想删除几个月前提取的图像,这些图像具有正确的TAG.

所以,我不是要求只删除未标记的图像。我正在寻找一种方法来删除一般未使用的图像,其中包括未标记的图像和其他图像,例如几个月前用正确的TAG.


阅读 179

收藏
2022-02-28

共1个答案

小编典典

2016 年 9 月更新:Docker 1.13:PR
26108和提交
86de7c0
引入了一些新命令,以帮助可视化
docker 守护程序数据在磁盘上占用的空间,并允许轻松清理“不需要”的多余空间。

docker system prune
将删除所有悬空数据(即按顺序:容器停止,没有容器的卷和没有容器的图像)。即使是未使用的数据,也可以-a选择。

你还有:

对于 未使用 的图像,请使用docker image prune -a(用于删除悬空 未使用的图像)。
警告:“ 未使用 ”表示“任何容器未引用的图像”:使用前要小心-a

如AL的回答所示,dockersystem prune --all将删除所有 未使用 的图像,而不仅仅是悬挂的图像......这可能有点太多了。

结合docker xxx prune--filter选项可能是限制修剪的好方法(至少
docker SDK API 1.28,所以 docker
17.04+

当前支持的过滤器有:

  • until (<timestamp>)- 仅删除在给定时间戳之前创建的容器、图像和网络
  • label( label=<key>, label=<key>=<value>, label!=<key>, or ) - 仅删除带有(或 不带 ,如果使用)指定标签的label!=<key>=<value>容器、图像、网络和卷。 __label!=...

有关示例,请参见“修剪图像”。

原始答案(2016 年 9 月)

我通常这样做:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

我有一个[删除那些悬空图像的别名:drmi]
13

过滤器找到未使用的dangling=true图像

这样,任何不再被标记图像引用的中间图像都会被删除。

首先
退出的进程(容器)做同样的事情

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

从技术上讲, 你应该在清理镜像之前先清理容器,因为这会捕获更多的悬空镜像和更少的错误


Jess Frazelle (jfrazelle)具有bashrc
功能

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

要删除旧图像,而不仅仅是“未引用的悬空”图像,您可以考虑 docker- gc


一个简单的 Docker 容器和镜像垃圾回收脚本。

  • 一个多小时前退出的容器将被移除。
  • 之后不属于任何剩余容器的图像将被删除。
2022-02-28