如何清理docker覆盖目录?

我通过CoreOS和AWS的ECS运行docker。 我有一个失败的图像,重新启动了很多次,容器仍然在 – 他们填补了我的驱动器分区。 具体来说, /var/lib/docker/overlay/包含大量文件/目录。

我知道docker-cleanup-volumes是一件事情,但它清除/ volumes目录,而不是/ overlay目录。

docker ps -a在我的不好的docker集装箱上显示超过250次启动尝试。 但是他们没有跑步。

除了rm -rf /var/lib/docker/overlay/* ,我该如何清理呢?

这是我现在正在做这件事的黑客方式。 我不打算接受它作为答案,因为我希望有一个更好的方法。

 # delete old docker processes docker rm `docker ps -a | grep Exited | awk '{print $1 }'` ignore_errors: true # delete old images. will complain about still-in-use images. docker rmi `docker images -aq` 

我们刚开始有这个问题,而btafarelo的回答让我感到不安,或者至less让我对删除sha256条目感觉更好。

系统信息:在ELB后面运行CoreOS 1.12的ec2实例

  • 排除ELB中的docker实例
  • closures泊坞窗

     systemctl stop docker rm -rf /var/lib/docker/overlay/* 
  • 执行命令的结果

     for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done 
  • 重新启动(最简单的方法,使一切备份)

在服务重新启动后,这恢复了大约25%的磁盘,没有不良副作用。

我已经添加到我的开发环境中的bashrc,并习惯于每天运行它。

 function cleanup_docker() { docker ps -f status=exited -q | xargs -r docker rm docker images -f dangling=true -q | xargs -r docker rmi } 

在某些情况下,下面的脚本可以释放更多空间,因为它会尝试删除所有图像,只是失败而已:

 function cleanup_docker_aggressive() { for i in $(docker images --no-trunc -q | sort -u) do docker rmi $i 2> /dev/null done } 

可悲的是,他们并没有比你的解决scheme更清洁。

编辑:从Docker 2017.09开始,你可以用刚刚replace这两个

 docker container prune docker image prune -a 

后者,你可以使用花式filter,如--filter "until=24h"filter--filter "until=24h"

docker工人

  • – 安静

  • – 所有

  • – filter状态=已退出


docker工人

  • – 力

docker的图像

  • – 安静
  • – 所有
  • –filter dangling = true

docker工人rmi

  • – 强制

你的黑客方式很好。

 docker rm `docker ps -a | grep Exited | awk '{print $1 }'` 

我的哈克的方式是

 docker rm $(docker ps --all | awk '/ago/{print $1}') 

稍微干净一些的方法是使用--quiet (-q)标志运行docker ps来获取id号,而--filter status=exited exit -filter只是退出的。

 docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes 

或者使用--force (-f)标志运行docker rm ,使用--all (-a)标志运行docker ps以closures运行的

 docker rm --force $(docker ps --all --quiet) # remove all docker processes 

在几次失败的构build之后,可能会占用所有磁盘空间的是图像。 为了节省泊坞窗主机上的磁盘空间,请定期使用以下方式删除未使用的泊坞窗图像

 docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images 

或者变得更加激进,你可以 – (-f)清除 – (-a)图像

 docker rmi --force $(docker images --all --quiet) # clean all possible docker images 

@analytik将它放入.bashrc函数的方式看起来是一个实际的想法

 function cleanup_docker() { docker rm --force $(docker ps --all --quiet) # remove all docker processes docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images } 

如果您习惯于生成很多不需要的docker图像,请将其添加到.bash_logout中


您需要检查图像/容器,并删除/ opt / docker / overlay中检查执行时未find的文件夹

 docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt sudo ls -l /var/lib/docker/overlay > overlays.txt diff -u inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs sudo rm -rf /opt/docker/overlay/ 

从我们这边我们使用:

 sudo docker system prune -a -f 

哪个救我3Go!

我们也使用着名的命令:

 sudo docker rm -v $(sudo docker ps -a -q -f status=exited) sudo docker rmi -f $(sudo docker images -f "dangling=true" -q) docker volume ls -qf dangling=true | xargs -r docker volume rm 

我们把它放在cron上,以更有效地pipe理我们的磁盘空间。

干杯

参考: https : //forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4

Docker垃圾回收可以通过使用另一个Docker容器的简单方法来完成https://github.com/spotify/docker-gc

你可以使它运行一个cron使用https://github.com/flaccid/docker-docker-gc-crond