Uncloud `uc images` 命令详解:跨集群机器批量列出与过滤 Docker 镜像
2026/9/17 23:34:25 网站建设 项目流程

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 imagesuc 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.0myapp: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:portunix:///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"的完整链路,理解它能帮助你更好地预判命令行为:

  1. 连接集群list()首先调用uncli.ConnectCluster(ctx)建立与集群的连接(见 cmd/uc/image/ls.go),连接方式由当前上下文或--connect/--context等全局选项决定。

  2. 构造过滤条件:将-m展开后的机器列表与名称过滤组装为api.ImageFilter{Machines, Name}(定义见 pkg/api/image.go)。

  3. 集群内广播:客户端通过ProxyMachinesContext把请求广播到目标机器——未指定机器时附加元数据machines: *(表示全部机器),指定时附加各机器名或 ID(见 pkg/client/client.go)。随后经 gRPC 调用Docker.ListImagesRPC(协议定义见 api/pb/docker.proto)。

  4. 各机器处理:每台机器上的 gRPC 服务端 internal/machine/docker/server.go 反序列化请求中的image.ListOptions(其中 Filters 使用filters.FromJSON特殊反序列化),再交由service.ListImages(internal/machine/docker/service.go)调用本地 Docker 引擎,并把结果连同ContainerdStore标志一起打包返回。

  5. 聚合展示:客户端收到各机器的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 版本分布,判断是否存在版本漂移。
  • 关注STOREIN USESTOREdocker的机器无法直接接收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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询