显示所有 docker 个卷的大小而不安装它们

Show size of all docker volumes without mounting them

如何列出所有 docker 卷及其各自的大小。

docker volume inspect $(docker volume ls)

提供有关所有卷的信息,但每个卷的大小除外。

最好,我想检查大小而不必将它们安装到某个容器中,因为我有超过 20 个卷,其中包含一些神秘的 "hash"-卷名称,可能是由于某些错误而产生的,这我正在寻找。

使用默认的 overlay 存储驱动程序,Docker 卷没有 "size"(所有卷在同一文件系统上共享 space)。计算出卷消耗的 space 的唯一方法是遍历其中的所有文件并将它们各自的大小相加。有几种方法可以做到这一点。

我认为最简单的就是安装卷。例如:

docker volume ls -q |
while read vol; do 
  echo "=== $vol ==="
  docker run --rm -v "$vol:/data" alpine du -sh /data
done

如果你真的想避免 docker run,你可以这样做(注意我们使用 jq 来解析 docker volume inspect 的 JSON 输出):

docker volume ls -q |
while read vol; do
  mount=$(docker volume inspect "$vol" | jq -r '.[0].Mountpoint')
  echo "=== $vol ==="
  sudo du -sh "$mount"
done

我更喜欢第一种解决方案,因为即使 docker 守护程序位于 运行 远程主机或虚拟机上,它也能正常工作。例如,以上将在 Windows 或 MacOS 上失败,因为在这些系统上,Docker 是 运行 一个虚拟机,因此当 运行 du.

我在 Debian/Ubuntu 上使用这个:

sudo du -h /var/lib/docker/volumes | grep -iP '/var/lib/docker/volumes/[^/]+$'

输出如下所示:

4.0K    /var/lib/docker/volumes/22c886640f89e83d0f807c52a839a2a28ad38fd3acbf7aaac38f5f62d4577ff6
0       /var/lib/docker/volumes/863a598091f9c70b1a7e66119a976df8786e9ade798d1acd6a606a66bb3e54c4
325M    /var/lib/docker/volumes/b4a9996e26b078b112583947053ac81799de3d3509d865dc5683490739803037
30M     /var/lib/docker/volumes/948eb93d038f78925831562cd4954e1d98ca53717586210a84070492d243b394
30M     /var/lib/docker/volumes/dd5290f49376a913d5d9b5c845353d0363134d133b6f25b0db667bf68e1822f3
35M     /var/lib/docker/volumes/b2e8426cbbf1c5278ccb0e3bb45dc614c11fef8699c502f25da1718906513487
317M    /var/lib/docker/volumes/f9dfa3f3189084c3a10c86d9dd874fbb4fd8cf059db4479b784e959d7513ca0e
0       /var/lib/docker/volumes/0b33f67db05002285e4e1778f29954130499a63ca4ed1070108187d999951aca
120K    /var/lib/docker/volumes/92c1297c42c7bced027014da5a2a24e365f64fd2cd109e92265a4fca4ea83e51
30M     /var/lib/docker/volumes/6060e487abbe52de6e08cf049c8b55f9456e0158050b4543073dc0d531395137
30M     /var/lib/docker/volumes/6c3f6e1798d3b640078c1b2bd15c39de3fc8004c58f5a1655b69d7c2024f6eb1
35M     /var/lib/docker/volumes/5fe0fce0dedc065f5f21bdea264ffde173a714d4eb77373d351429dffc0f42c4

显然,并非所有卷都占用 space ,但 有很多卷占用了空间,在撰写本文时,我发现它们使用了超过 40 GiB!