如何使用“docker 卷修剪”?(“docker volume prune”即使在容器正在运行时也会删除所有卷)

Fla*_*uff 8 docker docker-volume

在 docker 文档中,它说了以下内容:

docker volume prune=== 删除所有未使用的本地卷

为了测试这一点,我使用 docker hub 的官方最新映像设置了一个 MongoDb 容器。这样做会在幕后创建 2 个卷,容器可能需要这些卷来存储数据。

现在运行时docker volume ls,我可以看到两个具有随机名称的卷。

假设我有多个容器,其中的卷使用随机名称。现在很难知道其中哪些仍在使用,所以我希望docker volume prune在这里提供帮助。

因此,我执行了该命令,希望docker volume prune在我的容器启动并使用 MongoDb 运行时不会删除任何内容。但实际发生的情况是,我的所有卷都被删除了。之后我的容器关闭并且无法重新启动。

我多次尝试重新创建此命令,即使每次容器运行时,该命令也会删除所有卷。

任何人都可以解释这种行为吗?

更新:

使用 MongoDB 映像的容器 ID 执行以下命令会显示 2 个卷:

docker inspect -f '{{ .Mounts }}' *CONTAINER_ID*
Run Code Online (Sandbox Code Playgroud)

因此,根据我的理解,docker 知道这些卷和容器属于同一组。

当我要求 docker 显示悬空卷时,它再次显示相同的卷:

docker volume ls --filter dangling=true
Run Code Online (Sandbox Code Playgroud)

因此,当它们悬空时,修剪命令将它们删除对我来说是有意义的。但我显然有与我的容器一起使用的卷,所以我不清楚。

小智 13

您可以删除所有现有容器,然后删除所有卷。

docker rm -vf $(docker ps -aq) && docker volume prune -f
Run Code Online (Sandbox Code Playgroud)

如果您只想删除未使用的卷,请尝试

docker volume prune
Run Code Online (Sandbox Code Playgroud)

或者

docker volume rm $(docker volume ls -qf dangling=true)
Run Code Online (Sandbox Code Playgroud)

  • 使用 Docker v24,“docker volume prune”将仅删除未使用的**匿名本地卷**。`docker volume rm $(docker volume ls -qf dangling=true)` 将为**命名**和未使用的**完成这项工作。 (3认同)