如何删除所有 Docker 卷?

154

如果我执行docker volume ls,我的卷列表将如下所示:

DRIVER              VOLUME NAME
local               305eda2bfd9618266093921031e6e341cf3811f2ad2b75dd7af5376d037a566a
local               226197f60c92df08a7a5643f5e94b37947c56bdd4b532d4ee10d4cf21b27b319
...
...
local               209efa69f1679224ab6b2e7dc0d9ec204e3628a1635fa3410c44a4af3056c301

我想一次性删除所有的卷。怎样做?

5个回答

309
官方命令以删除所有未使用的数据(包括没有容器的卷)将在docker 1.13版本中发布。
docker system prune  

如果你只想限制在卷上,只删除未使用的卷
docker volume prune

你还可以使用docker image prunedocker container prune等命令:
更多信息请参见“清理未使用的Docker对象”。
请查看提交 86de7c0PR 26108
你可以在play-with-docker.com上看到它的实际应用。
/ # docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
1296a5e47ef3        hello-world         "/hello"            7 seconds ago       Exited (0) 6 seconds ago                       prickly_poincare

/ # docker system  prune
WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
1296a5e47ef3ab021458c92ad711ad03c7f19dc52f0e353f56f062201aa03a35

当前(docker 1.13之前)管理卷的方式是通过PR 14242和docker volume命令引入的,该命令的注释记录于2015年7月的链接中。
docker volume rm $(docker volume ls -q --filter dangling=true)

OrangeDog评论中添加:

prune现在只会删除“匿名”卷。
要删除所有的悬空卷,您需要使用较旧的解决方案。

没错。

在Docker中,“悬空”卷指的是不再与容器关联的卷。这个术语更常用于镜像,其中“悬空”镜像是指那些没有标签且没有被任何容器引用的镜像。

要删除悬空卷,您可以使用以下命令:

docker volume rm $(docker volume ls -qf dangling=true)

(还在这个帖子中提到)

3
修剪命令非常好用,但一定要小心使用。它们似乎假设在调用时容器正在运行。这将清除可能与容器相关但没有实际使用的内容(例如网络),导致下次启动现有容器时出现故障。如果不确定哪些内容将被修剪,请提前使用“悬空”过滤器 :) - jocull
7
docker system prune 命令似乎无法删除本地卷,但 docker volume prune 命令可以解决这个问题。 - Maciek Rek
现在的修剪功能只能删除“匿名”卷。要清除所有悬空的卷,您需要使用较旧的解决方案。 - undefined
@OrangeDog 我同意。我已经编辑了答案以回应你的评论。 - undefined

47

2017年编辑: 此答案是在2016年4月16日发布的,现在已过时,仅适用于1.13之前的docker版本 请使用@VonC的答案,现在被标记为正确答案

要删除未使用的卷,可以使用内置的docker volume rm命令。rm命令还会删除/var/lib/docker/volumes中不是卷的任何目录,因此请确保您没有将任何想保存的内容放在其中:
列出卷的命令比您的略微正确:

$ docker volume ls -qf dangling=true

清理:

$ docker volume rm $(docker volume ls -qf dangling=true)

关于 ls 的更多细节请 在这里,关于 rm 请 在这里


1
我不会在没有使用--dry-run参数测试悬挂卷列表的情况下运行它。 - Sergei Rodionov
没有 --dry-run 选项。 - Harald Albers
3
如果您想删除所有卷,无论是什么,请使用此答案。谢谢! - Mücahit Yılmaz
这个答案并不过时:我使用的是 Docker 24.0.4,在我的 Ubuntu 上运行 docker volume prune -f 后,还剩下 1,300 个未被删除的卷。我尝试了很多方法,最后只有 docker volume rm $(docker volume ls -qf dangling=true) 才将它们移除。 - not2savvy

12

回答这个问题并借鉴Marc的话,可以这样实现:

$ docker volume rm $(docker volume ls -qf dangling=true | xargs)

1
“docker volume prune” 命令是无用的,没有任何作用。这个命令会真正地删除所有卷,就像问题所要求的那样。 - Nairum
docker volume prune不会删除悬空的卷,但它并不无用,与docker container prune相同。 - toing_toing

8

这是我发现有用的东西:https://github.com/chadoe/docker-cleanup-volumes

Shell脚本,用于删除/var/lib/docker/volumes和/var/lib/docker/vfs/dir中的孤立docker卷。 适用于Docker 1.4.1至1.11.x版本。

它基本上清理了任何被孤立/悬空的卷,但是它包括一个--dry-run选项,同时也注意到了一些docker内置命令(这些命令在先前的评论中有提到)。

Docker 1.9及以上版本的注意事项

为了删除Docker 1.9及以上版本中的孤立卷,您也可以使用内置的docker volume命令,而不是使用docker-cleanup-volumes脚本。内置命令还会删除/var/lib/docker/volumes中不是卷的任何目录,因此请确保您没有将任何要保存的内容放在其中:

列出:

$ docker volume ls -qf dangling=true

清理:
(注:此处指的是IT技术中的清理操作,如代码清理、数据清理等)
$ docker volume rm $(docker volume ls -qf dangling=true)

或者,更好地处理无操作(no-op),但仅适用于 Linux:
$ docker volume ls -qf dangling=true | xargs -r docker volume rm

0
如果你想删除特定的卷,可以使用*来删除 例如:runner-*
首先执行ls命令
使用以下命令 docker volume ls --format '{{ .Name }}' | grep -E "^runner-*" 如果你想更改字符串,只需将runner的名称替换为你的卷名称
然后将其与删除卷的命令合并 docker volume rm $(docker volume ls --format '{{ .Name }}' | grep -E "^runner-*")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接