Unclouduc images命令详解:跨集群机器批量列出与过滤 Docker 镜像
【免费下载链接】uncloudA lightweight tool for deploying and managing containerised applications across a network of Docker hosts. Bridging the gap between Docker and Kubernetes ✨项目地址: https://gitcode.com/GitHub_Trending/unc/uncloud
uc images是 Uncloud 命令行工具中用于在集群范围内列出 Docker 镜像的命令,默认会汇总所有已接入机器的镜像清单,并支持按机器与镜像名称(含通配符模式)精确过滤。读完本文,你将掌握uc images的完整语法、全部参数语义、输出表格中每一列的含义,以及该命令从 CLI 参数解析、gRPC 广播到各台机器 Docker 引擎的底层实现链路。
命令概览与用途
uc images的本质是列出集群中各台机器(machine)上已有的 Docker 镜像。它非常适合在以下场景使用:
- 部署前确认某台目标机器上是否已存在所需镜像,避免重复拉取;
- 排查镜像在集群中的分布情况,例如判断哪些机器缺少某个版本的镜像;
- 结合通配符模式,快速检索一批相关镜像(如某个应用的所有历史标签)。
命令的完整形式为:
uc images [IMAGE] [flags]其中[IMAGE]是可选的位置参数,用于按镜像名称(可带标签)过滤;不传时列出所有镜像。这与docker images的语义类似,但作用范围从单台宿主机扩展到了整个 Uncloud 集群。
说明:
uc images与uc image ls是同一命令的两个入口。从源码看,cmd/uc/images.go 中的NewImagesCommand直接复用了 cmd/uc/image/ls.go 的image.NewListCommand(),仅将命令名改为images、移除list别名并把示例中的uc image ls替换为uc images。二者在功能上完全等价,可视为image ls的别名形态。
常见用法示例
以下示例完整覆盖了uc images的典型使用方式:
# 列出所有机器上的全部镜像。 uc images # 列出指定机器上的镜像。 uc images -m machine1 # 同时列出多台机器上的镜像(逗号分隔)。 uc images -m machine1,machine2 # 按名称过滤(不限定标签),列出所有机器上名为 myapp 的镜像。 uc images myapp # 按名称模式过滤,并限定到指定机器。 uc images "myapp:1.*" -m machine1- 不传
IMAGE:返回集群内所有机器的全部镜像。 -m指定机器:可传机器名(name)或机器 ID,支持多次使用或逗号分隔组合。IMAGE带通配符:例如"myapp:1.*"会匹配myapp:1.0、myapp:1.2.1等所有以1.开头的标签;仅写myapp时匹配该名称下的任意标签。
参数详解
uc images自身选项
| 选项 | 类型 | 说明 |
|---|---|---|
-h, --help | 布尔 | 显示uc images的帮助信息。 |
-m, --machine strings | 字符串切片 | 按机器名或机器 ID 过滤镜像。可多次指定,也可用逗号分隔多个值,例如-m machine1,machine2。默认包含所有机器。 |
从实现上看,-m/--machine使用 cobra 的StringSliceVarP解析(见 cmd/uc/image/ls.go),并在进入业务逻辑前通过cli.ExpandCommaSeparatedValues展开逗号分隔的值;同时该 flag 还挂接了completion.MachinesFlag(cmd)用于生成机器的 shell 补全候选。位置参数最多接受 1 个(cobra.MaximumNArgs(1)),多余参数会直接报错。
继承自父命令的全局选项
以下选项来自uc根命令,适用于所有子命令,uc images同样支持:
| 选项 | 环境变量 | 说明 |
|---|---|---|
--connect string | $UNCLOUD_CONNECT | 不使用 Uncloud 配置文件,直接连接远程集群机器。格式支持[ssh://]user@host[:port]、ssh+go://user@host[:port]、tcp://host:port或unix:///path/to/uncloud.sock。 |
-c, --context string | $UNCLOUD_CONTEXT | 指定要使用的集群上下文名称,默认使用当前上下文。 |
--uncloud-config string | $UNCLOUD_CONFIG | 指定 Uncloud 配置文件路径,默认为~/.config/uncloud/config.yaml。 |
这些环境变量绑定逻辑位于 cmd/uc/main.go,通过cli.BindEnvToFlag实现,因此既可以用 flag 传入,也可以用环境变量传入。
输出解读:表格中的每一列
uc images的输出是一张多列表格。结合 cmd/uc/image/ls.go 中的列定义,各列含义如下:
| 列 | 含义与格式说明 |
|---|---|
IMAGE ID | 镜像 ID。与 Docker 的习惯一致,取完整 ID(sha256:前缀之后)的前 12 个字符。 |
NAME | 镜像名称,取RepoTag的第一项;无标签的悬空镜像(dangling image)显示为<none>。 |
PLATFORMS | 镜像支持的平台列表(如linux/amd64)。多架构镜像会列出全部可用平台,单平台镜像仅显示一个,未知时显示-。 |
CREATED | 镜像创建时间,以相对时间显示,例如3 days ago。 |
SIZE | 镜像大小,采用人类可读单位(如12.3MB)。 |
IN USE | 镜像是否正被容器使用:●表示至少有一个容器在使用(Docker API ≥ 1.51 才能获取该信息),○表示未被使用,-表示当前 Docker API 不提供该信息。 |
STORE | 镜像存储后端,docker表示 Docker 内置镜像存储,containerd表示启用了 containerd image store(containerd-snapshotter 特性)。 |
MACHINE | 该镜像所在机器的名称。 |
输出结果按镜像名称排序,名称相同时再按机器名排序(见 cmd/uc/image/ls.go),便于跨机器对比同一镜像的分布。
表格还有两处动态隐藏列的智能行为:
- 如果所有镜像都拿不到使用状态信息(即
IN USE全为-),该列会被整体隐藏; - 如果集群中所有机器都使用 containerd image store,
STORE列会被隐藏,避免冗余。
若集群中没有任何镜像,命令不会输出空表格,而是打印提示:未加名称过滤时显示No images found.,加了名称过滤时显示No images matching '<模式>' found.(见 cmd/uc/image/ls.go)。
名称过滤与通配符模式的工作原理
位置参数IMAGE的过滤并非简单的字符串包含匹配,而是透传给 Docker 的reference 过滤器。从 pkg/client/image.go 可以看到,客户端在构造image.ListOptions时设置了Manifests: true(用于获取平台信息),并把名称过滤转换为 Docker 过滤器参数:
opts := image.ListOptions{Manifests: true} if filter.Name != "" { opts.Filters = filters.NewArgs( filters.Arg("reference", filter.Name), ) }因此,IMAGE参数的匹配语义与docker image ls --filter "reference=..."一致,天然支持*通配符(如myapp:1.*),且不指定标签时默认匹配任意标签。这一模式匹配在每台机器上的 Docker 引擎内完成,而不是在客户端聚合后过滤,因此即使集群机器众多,过滤也能并行下推到各机器执行。
底层实现:一条命令的跨机器执行链路
uc images的背后是一条"CLI → gRPC → 各机器 Docker"的完整链路,理解它能帮助你更好地预判命令行为:
连接集群:
list()首先调用uncli.ConnectCluster(ctx)建立与集群的连接(见 cmd/uc/image/ls.go),连接方式由当前上下文或--connect/--context等全局选项决定。构造过滤条件:将
-m展开后的机器列表与名称过滤组装为api.ImageFilter{Machines, Name}(定义见 pkg/api/image.go)。集群内广播:客户端通过
ProxyMachinesContext把请求广播到目标机器——未指定机器时附加元数据machines: *(表示全部机器),指定时附加各机器名或 ID(见 pkg/client/client.go)。随后经 gRPC 调用Docker.ListImagesRPC(协议定义见 api/pb/docker.proto)。各机器处理:每台机器上的 gRPC 服务端 internal/machine/docker/server.go 反序列化请求中的
image.ListOptions(其中 Filters 使用filters.FromJSON特殊反序列化),再交由service.ListImages(internal/machine/docker/service.go)调用本地 Docker 引擎,并把结果连同ContainerdStore标志一起打包返回。聚合展示:客户端收到各机器的
MachineImages结果后逐条处理。若某台机器上列出镜像失败,不会导致整个命令失败,而是打印警告failed to list images on machine '<机器名>'后继续处理其他机器(见 cmd/uc/image/ls.go);最终所有成功结果合并为一张表格输出。
两个值得注意的细节
STORE列的数据来源:ContainerdStore字段由各机器在响应中显式上报(见 api/pb/docker.proto)。这一信息不仅是展示用途——在uc image push时,客户端还会用它校验目标机器是否启用 containerd image store,因为推送镜像到远程机器要求目标 Docker 启用该特性。- 平台信息来自 manifest 列表:
PLATFORMS列依赖请求时设置的Manifests: true。客户端会遍历镜像的 manifests,若发现存在与主镜像 digest 不同的 image manifest,即判定为多架构镜像,并提取各平台信息后排序展示(见 cmd/uc/image/ls.go)。
使用建议
- 善用
-m缩小范围:在机器数量较多的集群中,指定-m可以显著减少广播开销,也避免输出被无关机器淹没。 - 配合通配符做版本巡检:如
uc images "app:2.*" -m machine1,machine2可快速对比两台机器上的 2.x 版本分布,判断是否存在版本漂移。 - 关注
STORE与IN USE列:STORE为docker的机器无法直接接收uc image push推送的镜像;IN USE为●的镜像删除前需谨慎处理,避免影响运行中的容器。
如需查看该命令在命令行体系中的位置,可参阅 uc 命令总览;镜像管理的其他能力(如推送镜像uc image push)可参阅 uc image 相关文档。
【免费下载链接】uncloudA lightweight tool for deploying and managing containerised applications across a network of Docker hosts. Bridging the gap between Docker and Kubernetes ✨项目地址: https://gitcode.com/GitHub_Trending/unc/uncloud
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考