如何删除已删除的Docker容器的Docker卷?

8

我有一些测试需要运行大量的docker容器,每个容器都有一个卷。

我该如何知道需要删除的卷的名称呢?

例如:

~ docker run -d registry:2 
~ docker volume inspect c80fc65a79039d70cf54b3af3ab66b378dec42d0757928ae94277b197d8d8104
[
    {
        "CreatedAt": "2020-08-14T11:33:50Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/c80fc65a79039d70cf54b3af3ab66b378dec42d0757928ae94277b197d8d8104/_data",
        "Name": "c80fc65a79039d70cf54b3af3ab66b378dec42d0757928ae94277b197d8d8104",
        "Options": null,
        "Scope": "local"
    }
]

手动停止并删除 registry:2 容器后,该卷仍然存在。
我不想删除所有卷,因为其中一些仍在使用。
4个回答

11

无需自行确定卷名,实际上,您在此有多个选项。

如果要清理,可以在docker run上使用--rm标志

参考:docs.docker.com:清理(--rm)

如果设置了--rm标志,则Docker在删除容器时也会删除与容器关联的匿名卷。这类似于运行docker rm -v my-container。仅删除未指定名称的卷。例如,运行:

使用docker system prune --volumes命令清理所有未被至少一个容器使用的卷

参考:docs.docker.com:docker系统剪枝

删除所有未使用的容器、网络、镜像(悬空和未引用),并可选择删除卷。

获取相关联的卷

如果您确实想获得容器的卷,可以使用以下代码片段

docker inspect -f '{{ .Name }}{{ printf "\n" }}{{ range .Mounts }}{{ printf "\n\t" }}{{ .Type }} {{ if eq .Type "bind" }}{{ .Source }}{{ end }}{{ .Name }} => {{ .Destination }}{{ end }}{{ printf "\n" }}' <continaer-id>

3
为了清理所有匿名卷,我使用以下命令:
docker volume ls | awk '{if (length($2)==64 && $2!~/-/ && $2!~/_/) print $2}' | xargs -L1 docker volume rm

如果你好奇为什么会存在那些随机的卷,请在这里阅读更多相关信息。

1

您可以手动删除未使用的卷:

docker volume rm c80fc65a79039d70cf54b3af3ab66b378dec42d0757928ae94277b197d8d8104

或者修剪所有未使用的卷。
docker volume prune

删除所有未使用的本地卷。未使用的本地卷是那些没有被任何容器引用的卷。


1
我怎样知道需要删除的卷名?这就是我要找的内容... - Stav Alfi
你检查了 prune 吗? - Alex

0

那个线程只是提供了如何删除该机器上所有容器的所有卷信息。这不是OP想要的。 - MDickten

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