我如何知道 Docker 卷是否可以安全删除?

How can I know if a Docker volume is safe to delete?

在我的机器上,我有一些名称看起来像散列的卷。我不记得创建它们或使用它们。 docker volume inspect 表明它们是在很久以前创建的。有什么方法可以检查它们最后一次使用的时间,或者它们被什么使用?

那些是匿名卷。当您 运行 在图像上定义 VOLUME 的图像时,它们会被创建,而没有在该路径的容器上定义命名或主机卷。卷上没有标识创建它的容器的元数据。你能做的最好的事情就是检查卷的文件系统,看看它是否是你想要的。您可以 运行 一个临时容器并挂载卷,例如:

$ docker volume ls
DRIVER    VOLUME NAME
local     0fba4f8f84bae8700b9b5255a5819fa1bb0bf3e22b0350254c66daa9be11e7bc
local     1fb7aea19e66f595f4900407eac7240479eed40dc3b91b72bb129182ae82240c
...

$ docker run -it --rm -v 0fba4f8f84bae8700b9b5255a5819fa1bb0bf3e22b0350254c66daa9be11e7bc:/vol busybox sh
/ # ls -al /vol
total 40
drwx------   10 root     root          4096 Mar 17  2020 .
drwxr-xr-x    1 root     root          4096 Dec  5 14:00 ..
drwxr-xr-x    4 root     root          4096 Mar 17  2020 io.containerd.content.v1.content
drwxr-xr-x    4 root     root          4096 Mar 17  2020 io.containerd.grpc.v1.cri
drwx--x--x    2 root     root          4096 Mar 17  2020 io.containerd.metadata.v1.bolt
drwx--x--x    3 root     root          4096 Mar 17  2020 io.containerd.runtime.v1.linux
drwx--x--x    2 root     root          4096 Jun 25  2019 io.containerd.runtime.v2.task
drwx------    3 root     root          4096 Mar 17  2020 io.containerd.snapshotter.v1.native
drwx------    3 root     root          4096 Mar 17  2020 io.containerd.snapshotter.v1.overlayfs
drwx------    2 root     root          4096 Mar 17  2020 tmpmounts
/ # exit

从该目录中,我可以看到一些 containerd 目录,并假设在我自己的用例中这可能是某种 DinD 或临时构建器实例。

鉴于您很可能很久以前就删除了容器,因此删除卷几乎总是安全的。您可以 运行 以下内容删除任何具有长哈希名称的内容。如果卷当前正在使用,删除将失败,因此 运行宁甚至停止容器都没有风险。

docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | \
  xargs --no-run-if-empty docker volume rm

找出哪些卷正在被什么使用的唯一真正方法 - 据我所知 - 是枚举系统上的所有容器,然后为每个容器提取它引用的卷列表:

docker container inspect $(container) --format '{{range .Mounts}}{{.Name}}{{end}}'

为了实现您的实际 objective,Docker 自动保护容器不删除卷,如果它们被容器引用并且卷修剪可以为您进行清理:

docker volume prune