docker volume prune只删除未被任何容器引用的悬空卷,包括已停止容器残留的匿名卷、构建临时卷及自动创建的-v卷,不删运行中容器挂载的卷或主机手动目录。

docker volume prune 会删掉哪些数据卷
它只删除「当前没有被任何容器引用」的匿名或命名卷,包括:已停止容器曾使用但未显式删除的卷、构建中间阶段残留的临时卷、docker run -v /path 自动生成的匿名卷。不会动正在运行容器挂载的卷,也不会碰主机上手动创建的目录(哪怕路径在 /var/lib/docker/volumes/ 下)。
常见误判场景:
– 容器状态为 exited 但仍在 docker ps -a 列表里 → 卷仍被“引用”,prune 不会删
– 使用了 --volumes 的 docker system prune → 这个命令会连带删 volume,但默认不启用,必须显式加参数
执行前必须确认的三件事
不是所有“没被用”的卷都该删——尤其当卷名含业务关键词(如 pg_data、redis_cache)时,可能只是容器临时停了。
- 运行
docker volume ls看卷名和驱动类型,重点关注local驱动下的命名卷 - 查每个疑似可删卷是否被某容器声明过:
docker inspect <container-id> | grep -A 5 Mounts - 检查是否有外部进程(比如宿主机上的脚本、备份任务)直接读写该卷对应目录:
ls -l $(docker volume inspect <vol-name> -f '{{.Mountpoint}}')
安全执行 prune 的典型流程
别直接上 -f。先用 --dry-run(Docker 20.10+ 支持)预览将删什么:
docker volume prune --dry-run
输出类似:
Total reclaimed space: 2.14GB The following volumes will be removed: myapp_logs_2023 7f8a9c1e8b2d4a5f9c0e1d2f3a4b5c6d
确认无误后才真正执行:
- 删全部闲置卷:
docker volume prune -f - 只删匹配名称的(需 shell 支持):
docker volume ls -q | grep 'temp\|cache' | xargs -r docker volume rm - 配合系统级清理(谨慎):
docker system prune -f --volumes→ 这个会同时清镜像、构建缓存、网络、卷
prune 后发现删错了怎么办
基本没救。Docker 的 volume prune 是直接 rm -rf 对应目录,不走回收站,也不留快照。
唯一补救机会是:如果卷所在磁盘启用了文件系统级快照(如 ZFS、Btrfs),或宿主机有定时备份 /var/lib/docker/volumes/,才可能还原。否则只能从应用层恢复——比如从数据库备份恢复 pg_data 卷,或重新初始化缓存目录。
所以真正关键的不是怎么 prune,而是 prune 前有没有把卷名和用途记录清楚;生产环境建议禁用自动 prune,改用带人工确认环节的运维脚本。


















