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

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

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

最佳答案

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

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

你还有:

  • docker container prune
  • docker image prune
  • docker network prune
  • docker volume prune

  • 对于未使用的图像,请使用 docker image prune -a(用于删除悬空和未使用的图像)。
    警告:“未使用”的意思是“任何容器都没有引用的图像”:在使用 -a 之前要小心。

    A Lanswer 所示,docker system prune --all 将删除所有未使用的图像,而不仅仅是悬空的图像......这可能有点太多了。

    docker xxx prune --filter option 结合可以是限制修剪的好方法( docker SDK API 1.28 minimum, so docker 17.04+ )


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

  • 以“Prune images”为例。

    原始答案(2016 年 9 月)

    我通常这样做:
    docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
    

    我有一个 alias for removing those [dangling images] 13 : drmi


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

    我对 exited processes (containers) 做同样的 第一个
    alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
    

    由于 haridsv 指出 in the comments :



    Jess Frazelle (jfrazelle)bashrc function :
    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 - 如何删除旧的和未使用的 Docker 镜像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32723111/

    10-16 23:53
    查看更多