如何确定哪些容器使用 docker 卷?

Posted

技术标签:

【中文标题】如何确定哪些容器使用 docker 卷?【英文标题】:How to determine what containers use the docker volume? 【发布时间】:2017-08-09 00:20:40 【问题描述】:

假设我有一个卷并且我知道它的名称或 ID。

我想确定使用该卷的容器列表(它们的名称或 ID)。

我可以使用哪些命令来检索这些信息?

我认为它可以存储在 docker volume inspect <id> 命令的输出中,但除了挂载点 ("/var/lib/docker/volumes/<id>") 之外,它没有给我任何有用的信息。

【问题讨论】:

可能有更直接的方法,但大概你可以遍历所有容器(即docker ps -a的输出),然后查看docker inspect的相关部分。 使用下面的@jwodder 建议...使用xargs 将每个卷ID 传递给docker ps... 命令,并带有...docker volume ls -q | xargs -I_ docker ps -a --filter volume=_ 【参考方案1】:

docker ps 可以按卷过滤以显示挂载给定卷的所有容器:

docker ps -a --filter volume=VOLUME_NAME_OR_MOUNT_POINT

参考:https://docs.docker.com/engine/reference/commandline/ps/#filtering

【讨论】:

不确定区别,但仅以.Mounts 而不是.Config.Volumes(带有docker container inspect)引用的卷将不会显示在此过滤器中。 如果你是相反的,过滤器也适用于卷 ls:docker volume ls --filter name=container_name 如果您想输出关联的容器名称列表,例如在脚本中使用输出,您可以附加格式参数:docker ps -a --filter volume=VOLUME_NAME --format ".Names" 【参考方案2】:

这与 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()

【讨论】:

您必须使用 python 3.7 或更高版本运行它。 3.6 没有子进程模块的“capture_output=True”。

以上是关于如何确定哪些容器使用 docker 卷?的主要内容,如果未能解决你的问题,请参考以下文章

Docker之七:Docker数据卷管理

5docker容器数据卷

简单使用docker

linux12 - docker容器05 --> 数据卷挂载实战MySQL同步数据

Docker-基础使用:安装,启用,基本命令,数据卷

Portainer认识安装使用