我通过CoreOS和AWS的ECS运行docker。我有一个失败的图像多次重新启动,容器仍然在周围 - 他们填满了我的驱动器分区。具体来说,/var/lib/docker/overlay/
包含大量文件/目录。
我知道docker-cleanup-volumes是一个东西,但它清理/ volumes目录,而不是/ overlay目录。
docker ps -a
显示我的坏Docker容器上有超过250次启动尝试。但他们并没有跑步。
除了rm -rf /var/lib/docker/overlay/*
之外,我该怎样才能清理它?
答案 0 :(得分:18)
从我们这边使用:
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上以便更有效地管理磁盘空间。
干杯
参考: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4
答案 1 :(得分:10)
这是我现在这样做的黑客方式。我不会接受它作为答案,因为我希望有更好的方法。
# 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`
答案 2 :(得分:7)
我已经在我的开发环境中将它添加到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
}
可悲的是,他们并不比你的解决方案更清洁。
编辑:从Docker 1.13开始,您可以使用docker system:
docker system df # to check what is using space
docker system prune # cleans up also networks, build cache, etc
编辑:从Docker 2017.09开始,您还可以使用container和image
docker container prune
docker image prune -a
后者可以使用像--filter "until=24h"
答案 3 :(得分:4)
我们刚开始遇到这个问题,而btafarelo的回答让我对此有所帮助,或者至少让我对删除sha256条目感觉更好。
系统信息:在ELB后面运行CoreOS 1.12的ec2实例
关闭泊坞窗
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%的磁盘,没有任何不良影响。
答案 4 :(得分:2)
docker ps
- 安静
- 所有的
- 过滤状态=已退出
docker rm
码头图片
docker rmi
你的hacky方式很好。
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
我的hacky方式是
docker rm $(docker ps --all | awk '/ago/{print $1}')
稍微更简洁的方法是使用docker ps
( - q)标记运行--quiet
以获取ID号,并{ - 1}} - 仅过滤掉已存在的标识。
--filter status=exited
或使用docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
( - f)标志运行docker rm
,使用--force
( - a)标志运行docker ps
以关闭正在运行的标志1} p>
--all
在几次失败的构建之后,可能占用所有磁盘空间的是图像。要节省docker主机上的磁盘空间,请使用
定期删除未使用的docker镜像docker rm --force $(docker ps --all --quiet) # remove all docker processes
或为了更积极,您可docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
( - f)清理--force
( - a)图片
--all
@analytik将它放入.bashrc函数的方式似乎是一个实用的想法
docker rmi --force $(docker images --all --quiet) # clean all possible docker images
如果您习惯于生成许多您不需要的泊坞窗图像,请将其添加到.bash_logout
答案 5 :(得分:1)
Docker垃圾收集可以使用另一个docker容器以简单的方式完成 https://github.com/spotify/docker-gc
将其作为cron运行答案 6 :(得分:1)
这是一个可行的选择:
docker rm -f $(docker ps -a |awk 'NR>1&&/Exited/{print $1}')
答案 7 :(得分:1)
我遵循了这些简单的步骤
步骤1:df -h [检查已使用的内存,以确保覆盖文件夹使用了内存。]
步骤2:sudo docker system prune [此cmd删除所有未使用的容器/图像/网络]
步骤3:sudo docker image prune -a [对于任何悬空的图像,如果存在的话]
第4步:df -h [确保已删除覆盖数据]。
答案 8 :(得分:0)
小心,这个解决方案似乎删除了其他重要的东西。
您需要检查图像/容器并删除/ opt / docker / overlay中检查执行中未找到的文件夹
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/
答案 9 :(得分:0)
此处是从https://lebkowski.name/docker-volumes/
清除docker overlay目录的解决方案docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v
for Docker&lt; 1.9:
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')
或者对于Docker&gt; = 1.9:
docker volume ls -qf dangling=true | xargs -r docker volume rm