我们有一个 Ubuntu 服务器,在 Docker 下运行一些测试环境。今天系统空间不足,我最终发现
/var/lib/docker
已经增长到 826 GB,其中 /var/lib/docker/volumes
就达到了 600 GB。
结果 docker 已经创建了超过 1,300 个卷:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 12 9.271GB 447.8MB (4%)
Containers 12 10 405.9MB 62.84MB (15%)
Local Volumes 1307 8 634.8GB 630.8GB (99%)
Build Cache 3586 0 19.05GB 19.05GB
我尝试过
docker volume prune
(之前也尝试过强制修剪图像和容器),但只删除了少数卷。
我们有另一台服务器,在 Docker 下具有相同的测试环境,它看起来完全不同(即正常),只有 9 个卷:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 13 13 10.07GB 447.8MB (4%)
Containers 14 10 312.2MB 111.7MB (35%)
Local Volumes 9 9 5.212GB 0B (0%)
Build Cache 0 0 0B 0B
如果我检查其中一卷以找出它属于哪个容器或图像,我什么也得不到:
$ docker ps -a --filter volume=ff17641242297f3f9f3a63b2c328168f93c514e6e41cc3ed19bfbcb192acb5c7
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
我尝试了更激进的解决方案:
$ docker system prune -a -f
它删除了大量构建缓存对象(总共 21 GB),但没有删除卷。
Docker 怎么可能创建了 1,300 个无法修剪的卷?我能做什么来解决这个问题?
请注意,我发现为什么我的docker卷磁盘空间不足?,但是答案中给出的解决方案不起作用,所以我认为我的问题是不同的。
这个命令最终做到了:
docker volume rm $(docker volume ls -q --filter dangling=true)
根据文档,
docker volume prune -f
实际上应该可以完成这项工作,但事实并非如此。根据这个答案,上面是“旧方法”,但显然,这也是它实际工作的方式。