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

资讯详情

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

Podman 用户命名空间 UID 映射:--userns-uid-map-user 选项深度解析与实战

Podman 用户命名空间 UID 映射:--userns-uid-map-user 选项深度解析与实战 容器运行时云原生CLI【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址https://gitcode.com/gh_mirrors/po/podman点击查看免费下载导读本文以 Podman 的--userns-uid-map-user选项为主线系统讲解在podman build与farm build场景下如何从系统/etc/subuid文件中按用户名提取 UID 映射从而在文件系统层面正确设置构建工作容器内容的属主关系。读完本文你将掌握该选项的完整语法、与--userns-gid-map-group等兄弟选项的联动规则、rootless 与 rootful 场景下的语义差异以及其背后的源码级实现原理。一、选项概述它解决什么问题--userns-uid-map-user是 Podman 构建命令podman build、farm build提供的用户命名空间user namespace映射选项之一其官方定义位于 docs/source/markdown/options/userns-uid-map-user.mdSpecifies that a UID mapping to be used to set ownership, at the filesystem level, on the working containers contents, can be found in entries in the/etc/subuidfile which correspond to the specified user.翻译过来即该选项指定一个用户名Podman 会去/etc/subuid文件中查找与该用户对应的条目据此构造 UID 映射用于在文件系统层面设置工作容器working container内容的属主。它的应用场景非常明确当你在构建镜像时容器内RUN指令所写的文件需要落盘到宿主机的存储层而容器内 UID 与宿主机 UID 之间存在偏移必须借助 UID 映射才能保证文件属主正确、同时符合非特权用户的安全约束。文档同时指出处理RUN指令时运行的命令默认在各自的用户命名空间中执行并使用上述 UID 与 GID 映射进行配置。二、适用命令podman build 与 farm build在 userns-uid-map-user.md 文件头部有一组共享注释#### This option file is used in: #### podman build, farm build #### If file is edited, make sure the changes #### are applicable to all of those.这说明该选项是一个多命令共享的选项定义同时适用于本地构建podman build和农场式远程构建farm build。在 Podman 的文档体系中docs/source/markdown/options/目录存放的就是这类被多个命令.in模板引用的共享选项片段修改时需保证对使用它的所有命令生效。三、核心参数详解3.1 语法与取值--userns-uid-map-useruseruser一个系统用户名必须在宿主机/etc/subuid文件中存在对应条目。该选项不直接提供映射数值而是通过用户名间接引用/etc/subuid中的映射范围适合“按系统用户复用既有映射”的场景避免在命令行手写一长串 UID 三元组。3.2 /etc/subuid 文件/etc/subuid是 Linux 系统用于为普通用户分配子 UID 范围的标准文件由shadow-utils维护每一行的典型格式为用户名:起始UID:连续数量例如user1:100000:65536表示用户user1拥有从 UID 100000 开始、共 65536 个可用的从属 UID。Podman 的--userns-uid-map-useruser1即会读取该行将其转换为容器内的 UID 映射用于设置工作容器文件内容的属主。说明/etc/subuid的配套文件是/etc/subgid用于 GID 的同类映射这正是下一节--userns-gid-map-group的读取对象。3.3 与 --userns-gid-map-group 的联动规则原文档明确指出一条重要的默认推断规则If --userns-gid-map-group is specified, but --userns-uid-map-user is not specified,podmanassumes that the specified group name is also a suitable user name to use as the default setting for this option.即如果只指定了--userns-gid-map-groupgroup而没有指定--userns-uid-map-userPodman 会假设该组名同时也是合适的用户名直接用组名去/etc/subuid中查找 UID 映射作为默认值。反向同理在 userns-gid-map-group.md 中写道如果指定了--userns-uid-map-user而未指定--userns-gid-map-group则假定该用户名同时也是合适的组名用于/etc/subgid的查找。这一“以名推名”的设计简化了日常使用——只要系统里用户名与组名一致Linux 上创建用户时默认会创建同名主组通常只需指定其中一个选项即可。3.4 rootless 与 rootful 的关键差异NOTE原文档末尾有一段务必注意的说明NOTE:When this option is specified by a rootless user, the specified mappings are relative to the rootless user namespace in the container, rather than being relative to the host as it is when run rootful.rootful 运行映射相对于宿主机host的 UID/GID 空间。rootless 运行映射相对于容器内的 rootless 用户命名空间而不是宿主机。也就是说同一份/etc/subuid条目在不同运行方式下展开出的“实际含义”不同rootless 用户在使用时不能想当然地认为容器内 UID 与宿主机 UID 一一对应而应理解多了一层用户命名空间的嵌套偏移。四、同族选项对比四个映射选项的分工--userns-uid-map-user只是 Podman 构建命令中用户命名空间映射体系的一员。为便于对照下表综合了 userns-uid-map-user.md、userns-gid-map-group.md、userns-uid-map.md、userns-gid-map.md 四份文档选项参数形式映射来源说明--userns-uid-map-user用户名/etc/subuid中该用户的条目按用户名间接引用 UID 映射--userns-gid-map-group组名/etc/subgid中该组的条目按组名间接引用 GID 映射--userns-uid-map映射三元组命令行直接给出直接指定 UID 映射格式为“容器内起始 UID、宿主机起始 UID、连续 ID 数量”组成的一个或多个三元组--userns-gid-map映射三元组命令行直接给出直接指定 GID 映射格式同上针对 GID4.1 直接映射的格式与覆盖关系--userns-uid-map/--userns-gid-map接受“一个或多个三元组”每个三元组由容器内起始 ID、对应的宿主机起始 ID、以及该条目代表的连续 ID 数量组成。例如--userns-uid-map0:100000:65536表示将容器内 UID 0~65535 映射到宿主 UID 100000~165535。这两份文档还强调了两个覆盖/继承关系覆盖 storage.conf--userns-uid-map会覆盖/etc/containers/storage.conf中options段的remap-uids设置--userns-gid-map对应覆盖remap-gids。继承全局选项如果本命令未指定--userns-uid-map但提供了全局global级别的--userns-uid-map设置则使用全局设置的值。4.2 缺省时的交叉推断当映射选项缺失时Podman 会进行“互补推断”若--userns-uid-map-user、--userns-gid-map-group、--userns-uid-map均未指定但指定了--userns-gid-map则UID 映射使用与 GID 映射完全相同的数值见 userns-uid-map.md反之若只指定了--userns-uid-map则 GID 映射使用与 UID 映射相同的数值见 userns-gid-map.md。这保证了 UID 与 GID 两个维度始终成对存在避免只映射其中一个维度导致文件属主UID与属组GID不一致。4.3 总开关--userns上述映射选项作用于用户命名空间的“内部布局”而 userns.image.md 中定义的--userns选项则决定构建时用户命名空间的“开启方式”空字符串或container创建新的用户命名空间默认行为host复用podman自身运行所在的用户命名空间其他进程正在使用的用户命名空间路径加入该已存在的用户命名空间。五、源码级原理从命令行到存储映射要深入理解--userns-uid-map-user的语义需要沿着命令行解析 → specgen → ID 映射构造 → 存储层的调用链走一遍。5.1 构建命令的标志解析入口podman build在cmd/podman/common/build.go中统一处理构建相关选项其中通过 pkg/specgen/util/util.go 的 IDMappingOptions 解析用户命名空间与 ID 映射usernsOption, idmappingOptions, err : parse.IDMappingOptions(c, isolation)该函数将--userns、--userns-uid-map-user、--userns-gid-map-group、--userns-uid-map、--userns-gid-map等标志汇总转换为容器 spec 中可用的 ID 映射配置。在容器创建命令侧cmd/podman/common/create.go同样存在对应的标志注册模式例如--subuidname标志的描述即为 “Name of range listed in /etc/subuid for use in user namespace”并注册了针对/etc/subuid用户名条目的自动补全completion.AutocompleteSubuidName可见“按名引用 subuid 范围”是 Podman 中一贯的交互模式。5.2 ParseIDMapping映射的构造与互补填充核心实现位于 pkg/util/utils.go 的 ParseIDMapping函数签名func ParseIDMapping(mode namespaces.UsernsMode, uidMapSlice, gidMapSlice []string, subUIDMap, subGIDMap string) (*stypes.IDMappingOptions, error)其中subUIDMap/subGIDMap正是由--userns-uid-map-user/--userns-gid-map-group解析出的用户名/组名。关键逻辑如下自动推断填充subGIDMap为空而subUIDMap非空时subGIDMap subUIDMap反之亦然。这与文档中“以名推名”的规则一一对应if subGIDMap subUIDMap ! { subGIDMap subUIDMap } if subUIDMap subGIDMap ! { subUIDMap subGIDMap }读取系统映射当两者均非空时调用idtools.NewIDMappings(subUIDMap, subGIDMap)来自 containers/common 的 idtools 库真正去读取/etc/subuid与/etc/subgid中对应名称的条目生成UIDMap与GIDMap。host 映射标记只要解析出的 UID/GID 映射非空就将HostUIDMapping/HostGIDMapping置为false表示容器内容不再直接使用宿主 ID而是通过映射层落地。rootless 补全当以 rootless 方式运行时若只提供了 UID 或 GID 其中一侧的映射代码会利用父级可用 ID 范围自动补全另一侧见getAvailableIDRangesFromMappings与fillIDMap从实现层面印证了原文档中 rootless 场景下映射“相对 rootless 用户命名空间”这一语义。5.3 映射落地specgen → libpod 存储层构造好的IDMappingOptions最终进入容器 spec在 pkg/specgen/generate/container_create.go 中当用户命名空间未显式指定时会读取默认 namespace 模式并调用util.ParseIDMapping得到s.IDMappings当--usernsauto时还会为容器打上用户命名空间注解define.UserNsAnnotation并兜底生成默认 ID 映射后续libpod.WithIDMappings(*s.IDMappings)将该映射附加到容器运行时选项最终由存储层在写入工作容器内容如RUN指令产生的文件时完成 UID/GID 的重映射实现“文件系统层面的属主设置”。六、实战示例6.1 准备 subuid/subgid 条目假设宿主机存在用户builder并已在/etc/subuid与/etc/subgid中为其分配了从属 ID 范围通常由useradd自动写入也可手动编辑# /etc/subuid builder:100000:65536 # /etc/subgid builder:100000:655366.2 rootful 下按用户复用映射podman build --userns-uid-map-userbuilder -t myimage .Podman 读取/etc/subuid中builder的条目构造 UID 映射同时由于未指定--userns-gid-map-group会假定builder也是合适的组名从/etc/subgid读取对应的 GID 映射从而保证构建产物工作容器内容的 UID/GID 均落在builder的映射范围内。6.3 与直接映射混用/覆盖当需要对某一侧做更精细的控制时可以结合直接映射选项podman build \ --userns-uid-map-userbuilder \ --userns-gid-map0:100000:65536 \ -t myimage .此时 GID 映射以命令行三元组为准并覆盖 storage.conf 中的remap-gidsUID 映射仍取自/etc/subuid中builder的条目。6.4 farm build 场景farm build与podman build共享同一选项定义因此在多机农场构建时可以同样的方式指定构建节点的用户命名空间映射podman farm build --userns-uid-map-userbuilder -t myimage .七、注意事项与最佳实践确保用户名存在且范围充足指定的用户必须在/etc/subuid中有条目且条目覆盖的 ID 数量要足以容纳构建过程中容器内需要映射的 UID 范围否则构建会因映射不足而失败。rootless 语义不同rootless 用户指定该选项时映射是相对容器内 rootless 用户命名空间的与 rootful 下“相对宿主机”不同涉及嵌套用户命名空间时应先理清层级关系。成对使用更安全尽管 UID/GID 会互相推断补全但在有特殊属组要求的构建中建议显式同时给出--userns-uid-map-user与--userns-gid-map-group避免“以名推名”带来的隐式假设与预期不符。优先级意识直接映射--userns-uid-map/--userns-gid-map优先于/etc/containers/storage.conf中的remap-uids/remap-gids同时全局级映射设置可被命令级设置覆盖。规划配置时应明确各层级的生效顺序。可配合 --userns 使用映射选项负责“怎么映射”--usernshost|container|路径负责“用不用/用哪个用户命名空间”两者结合可覆盖从完全隔离到复用宿主命名空间的各种构建需求。八、延伸阅读选项权威定义docs/source/markdown/options/userns-uid-map-user.md同族选项userns-gid-map-group.md、userns-uid-map.md、userns-gid-map.md、userns.image.md源码实现pkg/util/utils.go 中的 ParseIDMapping、pkg/specgen/generate/container_create.go、cmd/podman/common/build.go用户命名空间模式全集docs/source/markdown/options/userns.container.md、userns.pod.md赞分享容器运行时云原生CLI【免费下载链接】podmanPodman: A tool for managing OCI containers and pods.项目地址https://gitcode.com/gh_mirrors/po/podman点击查看免费下载相关推荐Windows网络诊断利器etl2pcapng深度解析与实战指南Windows网络诊断利器etl2pcapng深度解析与实战指南 在Windows网络故障排查和性能分析领域工程师们长期面临一个关键痛点Windows内置容器运行时云原生CLIelastic.js源码解析Mixins组合模式如何优雅复用代码elastic.js源码解析Mixins组合模式如何优雅复用代码 elastic.js 是 elasticsearch Query DSL 的 JavaScr容器运行时云原生CLIPodman 用户命名空间 GID 映射选项 --gidmap 完全解析从 pod create 到内核映射实现Podman 用户命名空间 GID 映射选项 gidmap 完全解析从 pod create 到内核映射实现 gidmap 是 Podman 在创建 Pod容器运行时云原生CLI上一篇Trinity-RFT打造大型语言模型强化微调的通用框架下一篇终极 React Redux 7.1 快速入门指南从安装到实战的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表