如何自动删除未使用的docker镜像和容器?

时间:2018-03-09 15:39:49

标签: docker docker-swarm

有没有办法指示docker swarm自动运行垃圾收集并删除所有悬空图像和容器?我运行docker stack rm STACK_NAME并重新部署堆栈,但这会保留未使用的对象。我知道我可以运行docker prune进行清理,但有没有办法指示docker自动执行此操作?

P.S我尝试根据此post

设置历史记录保留限制

3 个答案:

答案 0 :(得分:7)

prune是你得到的最好的,并且需要通过其他东西在每个节点上实现自动化,因为Swarm内部不会为你做这件事。 但是通过服务,以及Bash单行和全局模式,这是一个简单的解决方法:

90%的时间是占用空间的旧图像,而且由于我们使用Swarm,我们不想在Swarm服务之外的主机上做某事,所以让我们运行一个简单的单行程在每个节点上每天修剪一次图像的服务中:

docker service create --name prune-images --mode global --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock docker sh -c "while true; do docker image prune -af; sleep 86400; done"

注意我不会手动删除容器,而是使用任务历史记录限制来控制容器。让旧任务保持不变(这可以让您检查退出代码/错误并显示其日志)。每个服务的默认值为5,因此如果要将集群中的所有Swarm服务更改为2,则为

docker swarm update --task-history-limit=2

然后旧容器将更早清理,并且它们使用的旧图像将被修剪捕获。请注意,历史记录包括正在运行的历史记录,因此限制为2表示单个关闭容器将会挂起(包括其检查元数据和日志)。

答案 1 :(得分:4)

感谢@DhiaTN提供的准确答案。我正在报道一些遗漏点。 要删除所有未标记的图像,使用 的图像:

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

答案 2 :(得分:3)

您执行以下操作:

docker stop $(docker ps -a) # stop all containers
docker rm $(docker ps -a) -f # delete all containers
docker rmi $(docker images -a -q) # delete all images

了解更多options