如何确定使用Docker卷的容器?

144
假设我有一个卷,我知道它的名称或 ID。
我想确定使用该卷的所有容器的列表(它们的名称或 ID)。
我可以使用哪些命令来检索此信息?
我以为它可以存储在 docker volume inspect <id> 命令的输出中,但除了挂载点("/var/lib/docker/volumes/<id>")之外,它没给我任何有用的东西。

可能有一种更直接的方法,但是你可以迭代所有容器(即 docker ps -a 命令的输出)然后查看 docker inspect 的相关部分。 - Oliver Charlesworth
5
使用下面@jwodder的建议,使用xargs将每个volume id传递给docker ps...命令,具体为:docker volume ls -q | xargs -I_ docker ps -a --filter volume=_ - mlo55
4个回答

243

1
不确定区别,但是仅被引用为.Mounts而不是.Config.Volumes(使用docker container inspect)的卷将不会在此过滤器中显示。 - Kevin
30
如果您想进行相反的操作,筛选器也适用于卷列表的容量:docker volume ls --filter name=container_name - RaisinBranCrunch
1
如果您想要仅输出关联的容器名称列表,例如用于脚本中,可以附加一个格式参数:docker ps -a --filter volume=VOLUME_NAME --format "{{.Names}}" - pablo.bueti
3
@RaisinBranCrunch 似乎是通过卷名称而不是容器名称进行过滤的。 docker volume ls --filter name=volume_name。要按容器名称获取卷,请使用 docker inspect --format '{{ .Mounts }}' container_name 或该命令的变体:https://dev59.com/Cl0a5IYBdhLWcg3wmZzC - Dario Seidl
@DarioSeidl Raisin的docker volume ls --filter name=container_name对我来说可以获取挂载到指定容器的卷。 - Filcuk

9
下面的脚本将显示每个使用该卷的容器:
#!/bin/sh

volumes=$(docker volume ls  --format '{{.Name}}')

for volume in $volumes
do
  echo $volume
  docker ps -a --filter volume="$volume"  --format '{{.Names}}' | sed 's/^/  /'
done

按容器列出卷略微棘手,因此这是一个供读者练习的练习,但以上内容应该足够,除非您有许多容器/卷。


5
对于每个卷,该脚本输出使用此卷的容器列表,注意一个卷可能被多个容器使用。
for v in $(docker volume ls --format "{{.Name}}")
do
  containers="$(docker ps -a --filter volume=$v --format '{{.Names}}' | tr '\n' ',')"
  echo "volume $v is used by $containers"
done

3
这与 jwodder 的建议有关,如果对某人有帮助的话。它基本上提供了所有卷的摘要,以防你有多个卷并且不确定哪个是哪个。
import io
import subprocess
import pandas as pd


results = subprocess.run('docker volume ls', capture_output=True, text=True)

df = pd.read_csv(io.StringIO(results.stdout),
                 encoding='utf8',
                 sep="    ",
                 engine='python')

for i, row in df.iterrows():
    print(i, row['VOLUME NAME'])
    print('-' * 20)
    cmd = ['docker', 'ps', '-a', '--filter', f'volume={row["VOLUME NAME"]}']
    print(subprocess.run(cmd,
           capture_output=True, text=True).stdout)
    print()

1
你必须使用Python 3.7或更高版本运行此程序。3.6版本的subprocess模块没有"capture_output=True"选项。 - Dave
1
使用选项 shell=True,它的效果更好。即:subprocess.run('docker volume ls', capture_output=True, text=True, shell=Ture)。感谢 @Oren! - aks

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