尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Podman 网络标签(--label / Label=)完全指南:为 network 附加 OCI 元数据

Podman 网络标签(--label / Label=)完全指南:为 network 附加 OCI 元数据 Podman 网络标签--label / Label完全指南为 network 附加 OCI 元数据【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址: https://gitcode.com/gh_mirrors/po/podman导读在 Podman 中--labelkeyvalue网络创建与 Quadlet 单元文件中的Labelkeyvalue网络声明是向网络对象附加 OCI 标签的标准方式。本指南以 label.network.md 为骨架结合podman network create的命令行实现、podman-network.unit.5.md.in的 Quadlet 选项表和标签解析源码完整讲解标签的语法、传值方式、底层解析原理、查看与使用场景并给出可复制的实战示例。读完本文你将能熟练地为网络附加和检索元数据并理解标签在命令行与 Quadlet 两种入口下的一致性设计。标签选项的作用与适用入口--label选项用于在创建网络时设置一个或多个 OCI 标签keyvalue 形式其文档声明适用于两个入口podman network createCLI 入口——--label*keyvalue*对应文档中的#### **--label***keyvalue*标题形式Quadlet[Network]单元文件systemd 声明式入口——Labelkeyvalue [keyvalue ...]对应文档中的### \Labelkeyvalue [keyvalue ...] 标题形式。两个入口共享同一份选项文档原文档头部注释明确写道This option file is used in: podman network create, podman-network.unit.5.md.in因此无论是命令行还是 systemd 单元文件标签的语义、语法与存储方式完全一致。语法与参数说明语法--labelkeyvalueCLILabelkeyvalueQuadlet。其中key是标签名value是对应的值。可重复选项可以指定多次每次设置一个标签同一个标签键被重复指定时后值覆盖前值详见下文源码解析。键名限制key不能为空。解析时若键为空会直接报错invalid label format见cmd/podman/parse/net.go中GetAllLabels对strings.Cut(label, )结果的校验。Quadlet 写法在[Network]段中每行写一个Labelkeyvalue可写多行实现多个标签Quadlet 的KeyLabel为可重复键见 quadlet.go 中NetworkGroup的SupportedKeys。与其它--label的区别Podman 中--label广泛用于容器、Pod、卷、镜像、网络等对象如容器创建时的--label、卷的Label本选项专门作用于网络对象它把标签写入网络的元数据而不是容器的元数据。注意podman network create的网络--label与容器--label是互相独立的两套键值网络标签只能通过podman network inspect查看。结合源码理解标签的底层实现CLI 解析从字符串到 map在podman network create中标签以字符串切片形式通过--label收集再交给parse.GetAllLabels转换为map[string]string// cmd/podman/networks/create.go 中 networkCreateFlags 定义 labelFlagName : label flags.StringArrayVar(labels, labelFlagName, nil, set metadata on a network) _ cmd.RegisterFlagCompletionFunc(labelFlagName, completion.AutocompleteNone)创建时// cmd/podman/networks/create.go networkCreateOptions.Labels, err parse.GetAllLabels([]string{}, labels) if err ! nil { return fmt.Errorf(failed to parse labels: %w, err) }GetAllLabels的解析逻辑net.go核心是for _, label : range inputLabels { key, value, _ : strings.Cut(label, ) if key { return nil, fmt.Errorf(invalid label format: %q, label) } labels[key] value }由此可知每个--label参数按第一个切分为键和值键为空时报错同键重复时 map 赋值天然产生“后者覆盖前者”的效果。解析后的 Labels 作为entities.NetworkCreateOptions.Labelsmap[string]string见 network.go被写入网络配置。Quadlet 翻译Label到--labelQuadlet 的[Network]段中Labelkeyvalue会被翻译为podman network create --label keyvalue ...的命令行参数。见 quadlet.gokeyValKeys : map[string]string{ KeyOptions: --opt, KeyLabel: --label, } warn lookupAndAddKeyVals(network, NetworkGroup, keyValKeys, podman)KeyLabelLabel在NetworkGroup的SupportedKeys中被声明为受支持键quadlet.golookupAndAddKeyVals会把每个Label...行转成一个--label ...参数最终生成的 systemd 服务执行podman network create --label ...。这也解释了为何两个入口共享同一份选项文档——它们最终都汇入同一条创建路径。查看标签network ls / inspect创建后可通过以下命令查看$ podman network ls NAME DRIVER LABELS mynet bridge key1value1,key2value2podman network ls的LABELS列由 list.go 中的Labels()方法提供它调用common.FormatLabels将标签 map 转为排序后的逗号分隔keyvalue列表见 format.go以匹配 Docker CLI 输出风格// Labels returns the networks labels as a sorted, comma-separated list of // keyvalue pairs, matching Docker CLI output format. func (n ListPrintReports) Labels() string { return common.FormatLabels(n.Network.Labels) }更详细的结构化查看用podman network inspect$ podman network inspect mynet输出 JSON 中labels字段即创建时写入的标签 map。实战示例命令行创建带标签的网络# 单个标签 $ podman network create --label environmentproduction mynet mynet # 多个标签可重复指定 $ podman network create \ --label environmentproduction \ --label teamplatform \ --label ownerinfra \ mynet2 mynet2 # 与其它网络参数组合使用 $ podman network create \ --subnet 192.168.100.0/24 \ --gateway 192.168.100.1 \ --label environmentstaging \ prod-net prod-net验证$ podman network inspect prod-net | grep -A5 labels labels: { environment: staging }, $ podman network ls NAME DRIVER LABELS prod-net bridge environmentstagingQuadlet 单元文件中声明标签在.network单元文件中[Network]段内通过Label声明标签可写多行。以下示例在创建私有桥接网络的同时附加两个标签# mynet.network [Network] NetworkNameprivate0 Subnet10.10.0.0/16 Gateway10.10.0.1 Labelenvironmentproduction Labelteamplatform将单元文件放入 Quadlet 目录如/etc/containers/systemd/执行systemctl daemon-reload后启动生成的mynet-network.service系统会通过podman network create --label environmentproduction --label teamplatform ...自动创建systemd-mynet默认命名规则$NAME.network生成systemd-$NAME网络见 podman-network.unit.5.md.in。对应关系可参考 podman-network.unit.5.md.in 的选项映射表[Network]选项podman network create等价命令LabelXYZ--label XYZNetworkNamefoopodman network create fooSubnet192.5.0.0/16--subnet 192.5.0.0/16Gateway192.168.55.3--gateway 192.168.55.3标签的常见使用场景运维元数据管理标记网络所属环境environmentproduction、团队teamplatform、负责人、计费代码等便于在podman network ls/inspect中快速识别与审计与 Podman 自动更新机制配合的扩展点虽然io.containers.autoupdate这类自动更新标签主要作用于容器见 quadlet.go 中的autoUpdateLabel但网络标签同样属于 OCI 元数据体系可在脚本和上层编排中统一读取筛选与自动化标签可作为网络的稳定标识供脚本、监控或配置管理系统在podman network ls/inspect输出中定位特定网络而不必依赖随机生成的网络 ID。注意事项标签仅在创建时设置--label只存在于podman network create中网络创建后不能通过更新命令追加标签podman network update目前仅支持 DNS 服务器增删见 network.go。如需修改标签需删除网络后重建。键不能为空--label value这类写法会被解析器拒绝并报invalid label format。重复键后者覆盖同一键指定多次时以最后一次为准。Quadlet 更新语义按 podman-network.unit.5.md.in 的说明更新已有网络不受支持——要修改标签等参数必须先手动删除网络再重启服务。标签是纯元数据网络标签不影响数据路径转发、DNS 或 IPAM 行为只作为可检索的元信息存在。延伸阅读选项定义原文label.network.md命令主文档podman-network-create.1.md.inQuadlet 网络单元完整文档podman-network.unit.5.md.in标签解析实现cmd/podman/parse/net.go网络创建命令实现cmd/podman/networks/create.go标签展示实现cmd/podman/networks/list.go、cmd/podman/common/format.goQuadlet 翻译实现pkg/systemd/quadlet/quadlet.go【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址: https://gitcode.com/gh_mirrors/po/podman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表