如何清理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