如何清理docker覆盖目录?
how to clean up docker overlay directory?
我 运行 docker 通过 CoreOS 和 AWS 的 ECS。我有一个失败的图像,它被重新启动了很多次,而且容器还在附近——它们填满了我的驱动器分区。具体来说,/var/lib/docker/overlay/
包含大量的files/directories.
我知道 docker-cleanup-volumes 是个东西,但它会清理 /volumes 目录,而不是 /overlay 目录。
docker ps -a
显示我的错误 docker 容器超过 250 次启动尝试。不过,它们不是 运行。
除了rm -rf /var/lib/docker/overlay/*
,我如何I/should清理它?
这是我现在执行此操作的怪异方式。我不会接受它作为答案,因为我希望有更好的方法。
# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print }'`
ignore_errors: true
# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
我已经将它添加到我的开发环境中的 bashrc 中,并且每天都习惯 运行 它。
function cleanup_docker() {
docker ps -f status=exited -q | xargs -r docker rm
docker images -f dangling=true -q | xargs -r docker rmi
}
在某些情况下,以下脚本可以释放更多 space,因为它会尝试删除所有图像,但会静静地失败:
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 and image
docker container prune
docker image prune -a
后者可以与 --filter "until=24h"
等精美过滤器一起使用
docker ps
--安静
--全部
--过滤器状态=退出
dockerrm
- --力
docker 图片
- --安静
- --全部
- --filter dangling=true
docker rmi
- --力
你的 hacky 方式很好。
docker rm `docker ps -a | grep Exited | awk '{print }'`
我的 hacky 方法是
docker rm $(docker ps --all | awk '/ago/{print }')
一个稍微干净的方法是 运行 docker ps
和 --quiet
(-q) 标志只得到 id 号和 --filter status=exited
到 --filter 只是退出的。
docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
或 运行 docker rm
使用 --force
(-f) 标志和 docker ps
使用 --all
(-a) 标志关闭甚至 运行ning 的
docker rm --force $(docker ps --all --quiet) # remove all docker processes
在多次构建失败后,可能占用所有磁盘 space 的是图像。要在 docker 主机上节省磁盘 space,请定期删除
未使用的 docker 图像
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
或者为了变得更激进,你可以 --force
(-f) 它来清理 --all
(-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
Docker 可以使用另一个 docker 容器以简单的方式完成垃圾收集
https://github.com/spotify/docker-gc
将其 运行 作为 cron
小心点,这个解决方案似乎删除了其他重要的东西。
您需要检查 images/containers 并删除 /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/
我们刚开始遇到这个问题,btafarelo 的回答帮助我解决了问题,或者至少让我对删除 sha256 条目感觉更好。
系统信息:ec2 实例运行 ELB 背后的 CoreOS 1.12
- 从 ELB
中删除 docker 实例
关机docker
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% 的磁盘空间,没有任何不良影响。
我们这边使用了:
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 上以更有效地管理我们的磁盘 space。
参考:
https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4
这是从 https://lebkowski.name/docker-volumes/
中清除 docker 覆盖目录的解决方案
docker images --no-trunc | grep '<none>' | awk '{ print }' | xargs -r docker rmi
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v
对于 Docker < 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 >=1.9 :
docker volume ls -qf dangling=true | xargs -r docker volume rm
这是一个有效的选项:
docker rm -f $(docker ps -a |awk 'NR>1&&/Exited/{print }')
我遵循了这些简单的步骤
第1步:df -h [查看内存使用情况,确定是overlay文件夹占用的内存]。
第 2 步:sudo docker 系统修剪 [此 cmd 删除所有未使用的 containers/images/networks]
第 3 步:sudo docker image prune -a [对于任何悬挂图像,如果存在]
第 4 步:df -h [当然,覆盖数据已被删除]。
请注意 docker prune
命令不会清除 /var/lib/docker/overlay2
目录。
也不建议仅删除覆盖目录,因为它可能会影响现有容器。
我搜索了很多文章,但除了清理整个 docker 状态外,找不到任何清理覆盖目录的解决方案:
# Please understand that this will restart the docker engine in a completely empty state
# i.e. you will lose all images, containers, volumes, networks, swarm state, etc.
# You can obviously first take the backup of the directories that you want to keep and copy the contents back after restarting docker service.
service stop docker
rm -rf /var/lib/docker
service start docker
最后一条命令使 docker 服务再次恢复 /var/lib/docker 中的所有文件夹。
我 运行 docker 通过 CoreOS 和 AWS 的 ECS。我有一个失败的图像,它被重新启动了很多次,而且容器还在附近——它们填满了我的驱动器分区。具体来说,/var/lib/docker/overlay/
包含大量的files/directories.
我知道 docker-cleanup-volumes 是个东西,但它会清理 /volumes 目录,而不是 /overlay 目录。
docker ps -a
显示我的错误 docker 容器超过 250 次启动尝试。不过,它们不是 运行。
除了rm -rf /var/lib/docker/overlay/*
,我如何I/should清理它?
这是我现在执行此操作的怪异方式。我不会接受它作为答案,因为我希望有更好的方法。
# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print }'`
ignore_errors: true
# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
我已经将它添加到我的开发环境中的 bashrc 中,并且每天都习惯 运行 它。
function cleanup_docker() {
docker ps -f status=exited -q | xargs -r docker rm
docker images -f dangling=true -q | xargs -r docker rmi
}
在某些情况下,以下脚本可以释放更多 space,因为它会尝试删除所有图像,但会静静地失败:
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 and image
docker container prune
docker image prune -a
后者可以与 --filter "until=24h"
docker ps
--安静
--全部
--过滤器状态=退出
dockerrm
- --力
docker 图片
- --安静
- --全部
- --filter dangling=true
docker rmi
- --力
你的 hacky 方式很好。
docker rm `docker ps -a | grep Exited | awk '{print }'`
我的 hacky 方法是
docker rm $(docker ps --all | awk '/ago/{print }')
一个稍微干净的方法是 运行 docker ps
和 --quiet
(-q) 标志只得到 id 号和 --filter status=exited
到 --filter 只是退出的。
docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
或 运行 docker rm
使用 --force
(-f) 标志和 docker ps
使用 --all
(-a) 标志关闭甚至 运行ning 的
docker rm --force $(docker ps --all --quiet) # remove all docker processes
在多次构建失败后,可能占用所有磁盘 space 的是图像。要在 docker 主机上节省磁盘 space,请定期删除
未使用的 docker 图像docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
或者为了变得更激进,你可以 --force
(-f) 它来清理 --all
(-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
Docker 可以使用另一个 docker 容器以简单的方式完成垃圾收集 https://github.com/spotify/docker-gc
将其 运行 作为 cron小心点,这个解决方案似乎删除了其他重要的东西。
您需要检查 images/containers 并删除 /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/
我们刚开始遇到这个问题,btafarelo 的回答帮助我解决了问题,或者至少让我对删除 sha256 条目感觉更好。
系统信息:ec2 实例运行 ELB 背后的 CoreOS 1.12
- 从 ELB 中删除 docker 实例
关机docker
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% 的磁盘空间,没有任何不良影响。
我们这边使用了:
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 上以更有效地管理我们的磁盘 space。
参考: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4
这是从 https://lebkowski.name/docker-volumes/
中清除 docker 覆盖目录的解决方案docker images --no-trunc | grep '<none>' | awk '{ print }' | xargs -r docker rmi
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v
对于 Docker < 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 >=1.9 :
docker volume ls -qf dangling=true | xargs -r docker volume rm
这是一个有效的选项:
docker rm -f $(docker ps -a |awk 'NR>1&&/Exited/{print }')
我遵循了这些简单的步骤
第1步:df -h [查看内存使用情况,确定是overlay文件夹占用的内存]。
第 2 步:sudo docker 系统修剪 [此 cmd 删除所有未使用的 containers/images/networks]
第 3 步:sudo docker image prune -a [对于任何悬挂图像,如果存在]
第 4 步:df -h [当然,覆盖数据已被删除]。
请注意 docker prune
命令不会清除 /var/lib/docker/overlay2
目录。
也不建议仅删除覆盖目录,因为它可能会影响现有容器。
我搜索了很多文章,但除了清理整个 docker 状态外,找不到任何清理覆盖目录的解决方案:
# Please understand that this will restart the docker engine in a completely empty state
# i.e. you will lose all images, containers, volumes, networks, swarm state, etc.
# You can obviously first take the backup of the directories that you want to keep and copy the contents back after restarting docker service.
service stop docker
rm -rf /var/lib/docker
service start docker
最后一条命令使 docker 服务再次恢复 /var/lib/docker 中的所有文件夹。