/var/lib/docker/overlay/
包含大量的文件/目录。我知道docker-cleanup-volumes可以清理/volumes目录,但无法清理/overlay目录。
docker ps -a
显示我的坏Docker容器尝试过250多次启动,但它们并没有在运行。除了
rm -rf /var/lib/docker/overlay/*
,我应该如何清理这些内容?/var/lib/docker/overlay/
包含大量的文件/目录。docker ps -a
显示我的坏Docker容器尝试过250多次启动,但它们并没有在运行。rm -rf /var/lib/docker/overlay/*
,我应该如何清理这些内容?从我们这边来看,我们使用了:
sudo docker system prune -a -f
这帮我节省了3GB的空间!
我们还使用了一些著名的命令:
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
这是我目前正在使用的笨拙方法。我不会接受它作为答案,因为我希望有更好的方法。
# 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`
docker ps -a | awk '/Exited/{ print $1 }'
。不错的技巧。 - Krzysztof Jabłoński我已经将这个添加到了我的开发环境的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开始,您还可以使用容器和镜像
docker container prune
docker image prune -a
后者可以与诸如 --filter "until=24h"
这样的高级筛选器一起使用。
docker version ─╯ 客户端: 版本:18.09.6 API版本:1.39 Go版本:go1.10.8
- Tiana987642Shutdown docker
systemctl stop docker
rm -rf /var/lib/docker/overlay/*
Execute the results of the commands
for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
reboot (easiest way to bring everything back up)
在服务重新启动后,这样做可以恢复大约25%的磁盘空间,且没有任何负面影响。
/var/lib/docker/overlay/
中。我不得不手动卸载它们以便删除它们。 - Joel B这不是真实情况!
/var/lib/docker/overlay2
,顾名思义,包含了一堆overlay
文件系统(可以参考这里进行简要介绍)。运行命令mount | grep overlay2
,你会发现所有的/var/lib/docker/overlay2/*/merged
文件夹都是overlay
类型的挂载点。这意味着du
所显示的并不是真实情况。为了了解这些文件夹(在磁盘上)实际占用了多少空间,你需要将注意力限制在overlayfs挂载的upper
目录上(在docker中称为diff
),例如:
du -sch /var/lib/docker/overlay2/*/diff
...
3.8G total
作为对比,就我的情况而言:
> du -sch /var/lib/docker/overlay2
...
17G total
du
并没有告诉你磁盘是否已满。也许你是指df
?如果是这样,df
所说的都是真实的。我相信我的回答已经解决了你的问题,告诉你如何只看到真实的部分。 - undefineddocker ps
--quiet
--all
--filter status=exited
docker rm
docker镜像
docker rmi
你的hacky方式很好。
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
来过滤出已退出的容器。docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
或者使用带有--force
(-f)标志的docker rm
和带有--all
(-a)标志的docker ps
来关闭正在运行的容器。
docker rm --force $(docker ps --all --quiet) # remove all docker processes
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
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 builder prune
这有助于清理Docker的overlay2文件夹
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目录中的所有文件夹。
... xargs -r docker volume rm
)。确保在运行此命令时,可能使用这些卷的容器正在运行。否则,它们将被视为悬空状态,因此会被删除。 - Julien