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

新手上路,请多包涵

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

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

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

原文由 Quanlong 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 911
2 个回答

(原答案见下文)


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

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

你还有:

对于 未使用 的图像,请使用 docker image prune -a (用于删除悬空 未使用的图像)。

警告:“ _未使用_”表示“任何容器未引用的图像”:在使用 -a 之前要小心。

AL回答 所示, docker system 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> ) - only remove containers, images, networks,和带有(或 _不带_,如果使用 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")'

正如 haridsv 在评论中 指出的那样:

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


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 容器和镜像垃圾回收脚本。

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

原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新第二次(2017-07-08)

(再次)参考 VonC,使用更新的 system prune 。不耐烦的人可以使用 -f, --force 选项跳过提示:

 docker system prune -f

不耐烦和 鲁莽 的人还可以使用 -a, --all 选项删除“未使用的图像,而不仅仅是悬空的图像”:

 docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

更新

请参阅使用最近添加的 prune 命令的 VonC 的答案。这是相应的shell别名方便:

 alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

旧答案

删除已停止(退出)的容器:

 $ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

删除未使用的(悬空)图像:

 $ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

如果您对 不可撤销的数据丢失 _非常谨慎_,那么您可以删除未使用的(悬空)卷(v1.9 及更高版本):

 $ docker volume ls -qf "dangling=true" | xargs docker volume rm

在这里,它们位于一个方便的 shell 别名中:

 alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

参考

原文由 rubicks 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题