长时间运行 Docker 时,系统中有很多映像。如何安全地一次删除所有未使用的 Docker 映像以释放存储空间?
此外,我还想删除几个月前提取的具有正确TAG
。
因此,我并不是要仅删除未标记的图像。我正在寻找一种删除常规未使用图像的方法,其中包括未标记的图像和其他图像,例如几个月前使用正确的TAG
提取的图像。
2016 年 9 月更新:Docker 1.13: PR 26108和commit 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>)
- 仅删除在给定时间戳记之前创建的容器,图像和网络label
( label=<key>
, label=<key>=<value>
, label!=<key>
或label!=<key>=<value>
)- 仅使用()删除容器,图像,网络和卷或不使用 ,如果使用label!=...
则使用指定的标签。 有关示例,请参见 “ 修剪图像 ”。
原始答案(2016 年 9 月)
我通常这样做:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
我有一个别名来删除那些 [悬挂的图像] 13 : drmi
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 容器和图像垃圾收集脚本。
- 一个多小时前退出的容器将被删除。
- 之后不属于任何剩余容器的图像将被删除。
更新第二个(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