云原生【免费下载链接】buildahA tool that facilitates building OCI images.项目地址https://gitcode.com/gh_mirrors/bu/buildah点击查看免费下载导读buildah config是 buildah 中用于就地修改工作容器working container配置的核心命令它允许你在不重新构建、不重新拉取镜像的情况下直接更新容器的环境变量、入口点、标签、健康检查、平台信息等 30 余项配置并在后续buildah commit时将这些修改固化到最终镜像中。读完本文你将掌握buildah config的全部参数语义、字符串/数组两种 entrypoint 与 cmd 的协作机制、尾随短横线删除语法、OCIv1 与 Docker 双格式差异以及这些行为背后的源码级实现原理。命令概览与基本用法语法与用途buildah config [options] containerbuildah config用于更新某个容器保存的一项或多项设置。命令的典型工作流是先用buildah from创建或基于镜像一个工作容器再通过buildah config修改其配置最后用buildah commit将配置连同文件系统内容一起提交为镜像。从源码看cmd/buildah/config.go 中configCmd的实现非常直观它首先校验必须且只能指定一个容器参数container ID must be specified/too many arguments specified然后打开对应容器对应的 Builder 对象调用updateConfig逐项应用配置最后通过builder.Save()持久化openBuilder → updateConfig → builder.Save()config.go 中的这段调用链说明所有config修改都是即时生效并持久化到容器元数据中的而不是生成一个待执行的指令列表。参数顺序约束与 buildah 其他命令一样pkg/cli/common.go 中的VerifyFlagsArgsOrder强制要求所有选项必须位于容器名称之前容器名称之后不允许再出现以-开头的参数。tests/config.bats中的config-flags-order-verification测试正是对这一行为的验证。核心配置项详解--add-history记录配置变更历史--add-history为镜像的 history 添加一条记录记录本次对--cmd、--entrypoint、--env、--healthcheck、--label、--onbuild、--port、--shell、--stop-signal、--user、--volume、--workingdir这些配置的修改。默认值为false。可以用BUILDAH_HISTORY环境变量覆盖默认值export BUILDAH_HISTORYtrue源码依据pkg/cli/common.go中DefaultHistory()读取BUILDAH_HISTORY当值不区分大小写为true或1时返回true否则返回false在 cmd/buildah/config.go 的conditionallyAddHistory中若设置了--add-history标志则以命令行显式值为准否则回落到环境变量默认值。当开启时每个配置项都会调用builder.AddPrependedEmptyLayer以EmptyLayer: true的形式插入一条空层历史记录见 config.go这样buildah history就能完整还原镜像的每一处配置变更而不必为每次配置修改生成真实文件层。--annotation / -a镜像注解-a annotationannotation为将来基于该容器构建的镜像 manifest 添加注解可多次使用。三种特殊语义尾部带-从配置中移除该注解值为-移除全部注解只给键名不给值设置空值注解。--arch目标架构--arch architecture设置镜像的目标架构。默认情况下如果容器基于某个镜像创建则保留该镜像的目标架构否则记录宿主机的架构。对应 Builder 方法SetArchitecture会同时写入 OCIv1 与 Docker 两套配置结构config.go。--author作者信息--author author设置镜像作者的联系信息对应SetMaintainer同时写入OCIv1.Author与Docker.Authorconfig.go。--cmd默认命令--cmd command设置基于该镜像运行的容器的默认命令。与 entrypoint 组合使用时cmd 指定的是 entrypoint 的默认参数。updateCmd的处理逻辑cmd/buildah/config.go先尝试将参数按 JSON 数组解析exec 形式失败则退回用github.com/mattn/go-shellwords做 shell 分词shell 形式传入空字符串则清除 cmd。--comment镜像级注释--comment comment设置镜像级注释。注意OCIv1 镜像格式没有该字段使用 OCIv1 格式写镜像时该设置会被丢弃。源码中SetComment在容器格式不是 Docker 格式时会发出警告config.go。--created-by顶层层的创建说明--created-by created设置镜像最顶层是如何创建的描述文本对应SetCreatedBy。--domainname域名--domainname domain设置基于该镜像运行的容器所使用的域名。同样不适用于 OCIv1 格式写入 OCIv1 格式时会被丢弃且SetDomainname在非 Docker 格式下会给出警告config.go。--entrypoint入口点--entrypoint command | [command, arg1, ...]这是 buildah config 中最具细节的选项之一支持两种格式字符串形式shell 形式运行时该字符串会被拼接进/bin/sh -c之后执行同时容器运行时会忽略镜像的 cmd 值。源码updateEntrypointcmd/buildah/config.go会构造[/bin/sh, -c, entrypoint]三段式数组并警告cmd 存在但将被忽略。数组形式exec 形式完全替换 entrypointcmd 会被追加到 entrypoint 数组末尾一起执行。源码中 JSON 解析成功后若存在 cmd 会警告 cmd %q exists and will be passed to entrypoint as a parameter。文档中的实测示例可用buildah inspect验证字符串形式$ buildah from scratch $ buildah config --entrypoint /usr/bin/notashell working-container $ buildah inspect --format {{ .OCIv1.Config.Entrypoint }} working-container [/bin/sh -c /usr/bin/notshell] $ buildah inspect --format {{ .Docker.Config.Entrypoint }} working-container [/bin/sh -c /usr/bin/notshell]数组形式$ buildah config --entrypoint [/usr/bin/notashell] working-container $ buildah inspect --format {{ .OCIv1.Config.Entrypoint }} working-container [/usr/bin/notashell] $ buildah inspect --format {{ .Docker.Config.Entrypoint }} working-container [/usr/bin/notashell]注意第一个示例的输出是/usr/bin/notshell原文如此这正是/bin/sh -c拼接的体现。tests/config.bats中config entrypoint using single element in JSON array (exec form)、config entrypoint using multiple elements in JSON array (exec form)、config entrypoint using string (shell form)三个测试分别覆盖了这两种形态。--env / -e环境变量-e env[value]为基于该镜像的容器添加环境变量可多次使用。三种特殊行为只给env名字、不给和值从当前进程环境中取值尾部带-从配置中移除该变量值为-移除全部环境变量。源码依据updateConfig中 env 的处理cmd/buildah/config.go对namevalue形式用os.Expand展开变量包括从 Builder 已有 Env 列表取值对裸名字形式调用os.Getenv读取宿主环境并报错no value givenSetEnv在写入时会先剔除同名旧条目再追加新条目config.go保证语义是覆盖而非追加。--healthcheck 系列健康检查--healthcheck command --healthcheck-interval interval --healthcheck-retries count --healthcheck-start-interval interval --healthcheck-start-period interval --healthcheck-timeout interval--healthcheck指定检查容器是否正常运行的命令取值可以是NONE、CMD ...直接运行指定命令、CMD-SHELL ...通过系统 shell 运行或空值移除已设置的值及相关设置。--healthcheck-interval指定运行健康检查命令的间隔。--healthcheck-retries指定连续失败多少次后判定容器不健康。--healthcheck-start-interval指定启动期间健康检查之间的时间间隔。--healthcheck-start-period容器启动后的一段宽限期此期间的失败不会计入错误直到命令首次成功或宽限期结束之后的失败才计为错误。--healthcheck-timeout等待健康检查命令返回退出状态的最大时间超时视为失败。源码中updateHealthcheckcmd/buildah/config.go在未设置过健康检查时会以Test: [NONE]、Interval: 30s、Timeout: 30s、Retries: 3初始化默认值再逐项覆盖用户指定的字段间隔类参数统一通过time.ParseDuration解析如30s、1m30s。整个 HEALTHCHECK 设置同样只存在于 Docker 格式中OCIv1 格式会丢弃。--history-comment历史注释--history-comment comment为将来使用该容器创建的镜像的最顶层设置历史注释对应SetHistoryComment。--hostname主机名--hostname host设置基于该镜像运行容器的 hostname。不适用于 OCIv1 格式源码中当容器格式为 OCIv1 且指定了非空 hostname 时会警告 HOSTNAME is not supported for OCI V1 image formatcmd/buildah/config.go且SetHostname只写入 Docker 配置config.go。--label / -l标签-l labelvalue为镜像配置添加标签可多次使用。三种特殊语义尾部带-移除该标签值为-移除全部标签只给键名设置空值标签。SetLabel会同时写入 OCIv1 与 Docker 的 Labels 映射config.go。--onbuildONBUILD 指令--onbuild onbuild command向镜像添加 ONBUILD 命令当其他镜像以该镜像为基础构建时自动执行。仅 Docker 格式支持OCIv1 格式会忽略SetOnBuild在非 Docker 格式下会发出警告config.go。--os目标操作系统--os operating system设置镜像的目标操作系统。默认继承基础镜像的 OSFROM scratch场景则记录宿主机 OS 名称。--os-feature / --os-versionWindows 专用平台字段--os-feature feature --os-version version--os-feature设置镜像要求的操作系统特性列表通常仅在镜像 OS 为 Windows 时有意义。尾部带-移除单个特性值为-清空整个列表。--os-version设置精确要求的操作系统版本通常 Windows 基础镜像已设置因此一般无需手动指定。两者默认均继承基础镜像的值。SetOSFeature使用去重追加config.goUnsetOSFeature按值过滤移除config.go。--port / -p暴露端口-p port/protocol添加基于该镜像运行容器时要暴露的端口可多次使用。要点用port/protocol指定 TCP 或 UDP默认 TCP同时暴露 TCP 和 UDP 需要分别指定两次尾部带-且端口已设置时移除该端口值为-移除全部端口配置。SetPort将端口写入 OCIv1 的ExposedPorts映射与 Docker 的PortSetconfig.go。--shell默认 shell--shell shell覆盖 shell 形式命令使用的默认 shellLinux 容器的默认值是/bin/sh -c。OCIv1 格式不持久化该设置但在构建本镜像时对后续 RUN 指令仍然生效config.go 的注释明确说明了这一点。--shell的值同样经过shellwords.Parse分词后设置。--stop-signal停止信号--stop-signal signal设置容器停止时发送的默认信号默认是 SIGINT文档原文如此与常见的 SIGTERM 不同以本仓库文档为准。对应SetStopSignal同时写入 OCIv1 与 Docker 配置config.go。--unsetannotation / --unsetlabel阻断继承--unsetannotation annotation --unsetlabel label这两个选项用于取消基础镜像继承的注解或标签设置后即使基础镜像带有该注解/标签构建出的镜像中也不会包含。实现上直接调用builder.UnsetAnnotation/builder.UnsetLabelcmd/buildah/config.go。tests/config.bats中的config --unsetlabel与config --unsetannotation测试分别验证了这两种行为。--user / -u默认用户-u user[:group]设置基于该镜像运行容器的默认用户可指定用户名或 UID可选地以冒号接组名或 GID。使用名字时容器应在其/etc/passwd与/etc/group中包含对应条目。SetUser同时写入 OCIv1 与 Docker 的Config.Userconfig.go。--variant架构变体--variant variant设置镜像的目标架构变体如 ARM 的v7、v8。默认继承基础镜像的架构与变体FROM scratch场景记录宿主机的架构与变体。--volume / -v卷-v volume在目录树中标记一个位置为镜像的卷可多次使用。尾部带-且已设置时移除该卷值为-移除全部卷。AddVolume同时写入两套配置的Volumes映射config.go。--workingdir工作目录--workingdir directory设置基于该镜像运行容器的初始工作目录SetWorkDir同时写入 OCIv1 与 Docker 的WorkingDirconfig.go。双格式存储OCIv1 与 Docker 配置的同步与差异从 config.go 的initConfig可以看出buildah 在打开任意镜像/容器时会同时维护两套配置视图b.OCIv1OCI image-spec 的ociv1.Image结构b.DockerDocker v2 schema 的docker.V2Image结构。几乎所有 Setter如SetEnv、SetLabel、SetCmd、SetEntrypoint、SetPort、SetArchitecture、SetOS等都会同步写入两套结构保证无论最终以哪种格式提交镜像都能得到一致结果。但有一类设置仅在 Docker 格式中存在写入 OCIv1 镜像时会被丢弃源码注释与运行时警告都反复强调这一点设置项OCIv1 支持情况源码证据--comment✗ 丢弃config.go--domainname✗ 丢弃config.go--healthcheck系列✗ 丢弃config.go--hostname✗ 丢弃config.go--onbuild✗ 忽略config.go--shell✗ 不持久化构建期仍生效config.go因此如果你的目标格式是 OCIv1 且依赖上述设置需要显式使用 Docker 格式--format docker提交镜像或者在构建时以docker格式保存。实战示例以下示例均来自文档原文可直接在buildah from scratch创建的工作容器上执行# 设置作者与工作目录 buildah config --authorJane Austen --workingdir/etc/mycontainers containerID # 字符串形式shell 形式入口点 buildah config --entrypoint /entrypoint.sh containerID # 数组形式exec 形式入口点 buildah config --entrypoint [ /entrypoint.sh, dev ] containerID # 设置环境变量含从宿主环境取值 buildah config --env foobar --env PATH$PATH containerID # 移除环境变量 foo buildah config --env foo- containerID # 添加标签与移除标签 buildah config --label NameMycontainer --label Version1.0 containerID buildah config --label Name- containerID # 注解与移除注解 buildah config --annotation notemyNote containerID buildah config --annotation note- # 添加卷与移除卷 buildah config --volume /usr/myvol containerID buildah config --volume /usr/myvol- containerID # 暴露端口同一端口同时监听 TCP 与 UDP buildah config --port 1234 --port 8080 containerID buildah config --port 514/tcp --port 514/udp containerID # 纯数字形式的环境变量键 buildah config --env 12345678 containerID buildah config --env 1234- containerID # Windows 平台字段 buildah config --os-version 10.0.19042.1645 containerID buildah config --os-feature win32k containerID buildah config --os-feature win32k- containerID其中buildah config --annotation note-与buildah config --env 1234-两条命令文档中省略了容器参数原文如此实际执行时需要补全容器 ID 或名称。常见陷阱与使用建议entrypoint 与 cmd 的交互字符串形式 entrypoint 会让运行时忽略 cmd数组形式 entrypoint 则会把 cmd 作为参数追加执行。源码中updateEntrypoint与updateCmd的注释也明确了 cmd should always run after entrypoint 的顺序约定cmd/buildah/config.go。删除语义的尾随短横线env、label、annotation、port、volume、os-feature 均支持name-删除单条与-清空全部的统一约定掌握这一约定可以避免误操作。OCIv1 格式的字段缺失健康检查、注释、域名、hostname、onbuild、shell 等设置不会出现在 OCIv1 镜像中提交前务必确认目标格式。选项必须位于容器名称之前buildah config --env foobar containerID正确buildah config containerID --env foobar会报错。配置修改即时持久化config命令直接调用builder.Save()无需额外步骤但构建镜像仍需显式执行buildah commit。参考文档与源码命令手册原文docs/buildah-config.1.mdCLI 参数解析与默认值cmd/buildah/config.goBuilder 层配置读写实现config.goBUILDAH_HISTORY默认值逻辑pkg/cli/common.go行为验证测试tests/config.bats赞分享云原生【免费下载链接】buildahA tool that facilitates building OCI images.项目地址https://gitcode.com/gh_mirrors/bu/buildah点击查看免费下载相关推荐WeChatTweak底层架构macOS微信客户端的二进制补丁机制实现WeChatTweak底层架构macOS微信客户端的二进制补丁机制实现 WeChatTweak是一个针对macOS微信客户端的命令行工具通过Mach O二进逆向工程CLI即时通讯Buildah构建 OCI 容器镜像的命令行工具与 Go 库完全指南Buildah构建 OCI 容器镜像的命令行工具与 Go 库完全指南 Buildah 是一款专注于构建 Open Container InitiativeO云原生wgpu-hal 深度解析wgpu 跨平台硬件抽象层的设计理念与后端架构wgpu hal 深度解析wgpu 跨平台硬件抽象层的设计理念与后端架构 导读 本文围绕 wgpu hal/README.md https://link.gi云原生上一篇TiKV Hybrid Engine 组件维护指南磁盘引擎与 Region Cache 引擎之间的快照路由与一致性编排下一篇Ingress NGINX Controller 的 configuration-snippet 注解为单个 Ingress 注入自定义 Nginx 配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
