使用Docker buildx后如何回收CentOS 7上的磁盘空间?
问题解决指南:Docker Buildx多平台构建后VFS存储驱动下的冗余空间回收及差异分析
一、安全删除vfs/dir下的冗余Buildx文件
- 彻底清理Buildx builder实例
先执行docker buildx ls排查残留的builder节点,若存在则用docker buildx rm <builder-name>删除,再运行docker buildx prune -af强制清理所有构建缓存。 - 手动清理前的验证与操作
- 停止Docker服务避免写入冲突:
systemctl stop docker - 进入你的Docker data-root目录
/docker,查看vfs/dir下的文件夹,这些是VFS存储的镜像层。由于docker images无法识别,说明它们是Buildx构建时生成的、未被Docker主守护进程追踪的临时层。 - 可通过
/docker/buildx目录下的缓存记录,确认哪些文件夹属于Buildx冗余层;对于无关联的文件夹,直接删除:rm -rf /docker/vfs/dir/<folder-id> - 重启Docker服务:
systemctl start docker
- 停止Docker服务避免写入冲突:
- 后续预防策略
构建时指定独立缓存目录,避免污染VFS存储:docker buildx build --platform linux/amd64,linux/arm64 \ --cache-to type=local,dest=/tmp/buildx-cache \ --cache-from type=local,src=/tmp/buildx-cache \ -t <image-name> .
二、关联vfs/dir子文件夹与对应镜像
VFS存储驱动的每个文件夹名对应镜像层的ID,关联方法如下:
- 查看层元数据:进入目标文件夹,执行
cat /docker/image/vfs/layerdb/sha256/<layer-id>/diff-id获取diff-id,然后在/docker/image/vfs/imagedb/content/sha256/目录下查找包含该diff-id的镜像元数据文件,即可匹配到对应的镜像ID。 - 批量比对:执行
docker inspect $(docker images -q)查询所有镜像的层信息,将输出中的层ID与vfs/dir下的文件夹名逐一比对,找到关联的镜像。
三、VFS与Overlay2在Buildx构建后的空间差异原因
- 存储驱动特性差异
- Overlay2是分层存储驱动,支持写时复制(CoW),Buildx构建的临时层可通过共享基础层减少冗余,且Docker垃圾回收机制能有效追踪并清理未被引用的层。
- VFS是无共享机制的基础驱动,每个层都是完整的目录拷贝,Buildx构建多平台镜像时会生成大量独立临时层;若这些层脱离Docker主守护进程的追踪(Buildx使用独立builder实例),常规
prune命令无法识别清理。
- Docker版本与配置差异
- Docker 24.0.4与VFS存储驱动的兼容性存在问题,导致Buildx临时层未被正确标记为可回收;而Docker 23.0.6与Overlay2的适配性更好,垃圾回收能正常工作。
- 你配置了
data-root为/docker,Buildx缓存路径与默认路径不同,Docker垃圾回收未覆盖该路径下的VFS临时层;另一台默认配置的机器,Overlay2缓存路径在/var/lib/docker下,垃圾回收可正常扫描。
内容的提问来源于stack exchange,提问作者Pino
相关产品推荐
相关产品推荐

