协慌网

登录 贡献 社区

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

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

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

因此,我并不是要仅删除未标记的图像。我正在寻找一种删除常规未使用图像的方法,其中包括未标记的图像和其他图像,例如几个月前使用正确的TAG提取的图像。

答案

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

docker system prune会删除所有悬空数据(即,顺序:容器停止,没有容器的卷和没有容器的映像)。使用-a选项甚至可以使用未使用的数据。

您还有:

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

AL回答所示docker system prune --all会删除所有未使用的映像,而不仅仅是悬空的映像... 可能有点过多。

--filter docker xxx prune--filter选项结合使用是限制修剪的好方法( docker SDK API 1.28 最低,因此 docker 17.04+

当前支持的过滤器是:

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

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


原始答案(2016 年 9 月)

我通常这样做:

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

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

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

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

更新第二个(2017-07-08):

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

docker system prune -f

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

docker system prune -af

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

更新:

请参阅VonC 的答案 ,该答案使用最近添加的prune命令。这是相应的 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'

参考文献:

要删除超过一个月的旧标签图像:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

请注意,它将无法删除存储库中引用的容器使用的具有相关子图像的图像... 这可能就是您想要的。否则只需添加-f标志。

/etc/cron.daily/docker-gc脚本示例:

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm