如何删除旧的和未使用的Docker镜像
长时间运行码头时,系统中有很多图像。 我如何一次删除所有未使用的码头图像以释放存储空间?
另外,我还想删除几个月前拉出的具有正确TAG
所以,我并不是要求只删除未标记的图像。 我正在寻找一种方法来移除一般未使用的图像,其中包括未标记的图像和其他图像,例如几个月前用正确的TAG
拉出的图像
2016年9月更新:Docker 1.13:PR 26108和commit 86de7c0引入了一些新命令来帮助可视化Docker守护进程数据在磁盘上占用多少空间,并允许轻松清除“不需要的”过量。
docker system prune
将删除所有悬挂的数据(即顺序:容器停止,没有容器的容器和没有容器的图像)。 即使未使用的数据,带有-a
选项。
你也有:
docker container prune
docker image prune
docker network prune
docker volume prune
对于未使用的图像,请使用docker docker image prune -a
(用于删除悬挂和未图像的图像)。
警告:'未使用'是指“未被任何容器引用的图像”:在使用-a
前要小心。
原文答案(2016年9月)
我通常会这样做:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
我有一个别名来消除这些[摇晃的图像] 8: drmi
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):
再次参考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'
参考文献:
docker ps -f
docker rm
docker images -f
docker rmi
docker volume ls
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
链接地址: http://www.djcxy.com/p/18239.html