十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dagger TypeScript SDK BuildArg 类型别名实战指南:以键值对方式向 dockerBuild 传递构建参数

Dagger TypeScript SDK BuildArg 类型别名实战指南:以键值对方式向 dockerBuild 传递构建参数 Dagger TypeScript SDK BuildArg 类型别名实战指南以键值对方式向 dockerBuild 传递构建参数【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/dagger导读BuildArg是 Dagger 的 TypeScript SDK 中用于描述 Docker 构建参数build argument的类型别名它以{ name, value }键值对结构承载一次docker build中--build-arg的全部信息并被Directory.dockerBuild()的buildArgs选项所消费。本文以 BuildArg.md 为主线结合 SDK 生成源码、GraphQL API 测试与 Dagger 核心引擎实现讲解BuildArg的定义、用法、序列化规则与底层执行链路帮助你写出参数化、可复用、可缓存命中的容器构建流水线。一、BuildArg 是什么一段 13 行的类型别名定义在 Dagger TypeScript SDK 的 API 参考文档中BuildArg被定义为一个object类型的 TypeScript 类型别名Type Alias完整定义如下BuildArgobject包含两个必填属性属性类型必填含义namestring是构建参数名The build argument namevaluestring是构建参数值The build argument value对应生成源码位于 sdk/typescript/src/api/client.gen.tsexport type BuildArg { /** * The build argument name. */ name: string /** * The build argument value. */ value: string }从源码结构看BuildArg没有任何可选字段name与value均为必填string。这意味着在 TypeScript 严格类型检查下{ name: FOO }或{ value: bar }这类缺字段的对象都无法通过编译从类型层面杜绝了缺参构建的错误。为什么单独抽出一个类型别名BuildArg不是零散使用的一次性对象而是作为**复杂参数nested argument**出现在多个 API 的入参中。抽成类型别名后SDK 既能保证所有使用方共享同一类型约束也能让生成的 GraphQL 查询正确携带嵌套结构详见下文第三节。当前仓库中它被引用在两处类型BuildArg自身定义上述源码DirectoryDockerBuildOpts.buildArgs字段类型为BuildArg[]见 DirectoryDockerBuildOpts.md 与 sdk/typescript/src/api/client.gen.ts。二、BuildArg 的核心消费方Directory.dockerBuild()BuildArg本身不执行任何逻辑它的真正用途是作为Directory.dockerBuild()的选项传入。相关 API 文档 DirectoryDockerBuildOpts.md 中buildArgs字段的说明为buildArgs?:BuildArg[] Build arguments to use in the build.构建时要使用的构建参数即dockerBuild()接收一个可选的BuildArg数组等价于 Docker CLI 中重复出现的--build-arg KEYVALUE。它与其他选项共同构成一次完整的镜像构建选项类型说明dockerfile?string使用的 Dockerfile 路径例如frontend.Dockerfileplatform?Platform构建目标平台buildArgs?BuildArg[]构建参数列表即本文主题target?string要构建的目标构建阶段secrets?Secret[]传入构建的密钥挂载于/run/secrets/[secret-name]ssh?Socket构建期间用于 SSH 认证的 socket例如配合 Dockerfile 的RUN --mounttypessh通常由host.unixSocket()指向SSH_AUTH_SOCK获得noInit?boolean若设置跳过注入到RUN语句所创建容器中的自动 init 进程仅当用户要求 exec 进程必须是容器内 PID 1 时使用否则可能产生意外行为最小可用示例import { connect } from dagger.io/dagger connect(async (client) { const buildCtx client.host().directory(.) const image await buildCtx .dockerBuild({ dockerfile: Dockerfile, buildArgs: [ { name: GO_VERSION, value: 1.22 }, { name: APP_ENV, value: production }, ], }) .sync() console.log(built:, image) })上述代码中buildArgs数组内的每个BuildArg都会在底层被序列化为{ name: GO_VERSION, value: 1.22 }这样的对象最终以 GraphQL 参数形式发送给 Dagger 引擎效果等同于在 Dockerfile 中通过ARG GO_VERSION声明、并在构建时以--build-arg GO_VERSION1.22注入。三、序列化与查询构造SDK 如何发送 BuildArgBuildArg属于“复杂嵌套参数”其序列化行为可以直接从 SDK 的测试用例中得到印证。位于 sdk/typescript/src/api/test/api.spec.ts 的测试Compute nested arguments验证了这一点it(Compute nested arguments, async function () { const tree new Client() .directory() .dockerBuild({ buildArgs: [{ value: foo, name: test }] }) assert.strictEqual( querySanitizer(buildQuery(tree[_ctx][_queryTree])), { directory { dockerBuild (buildArgs: [{value:foo,name:test}]) } }, ) })这个测试揭示了三条关键事实字段顺序无关即使入参写成{ value: foo, name: test }序列化后的 GraphQL 也是{value:foo,name:test}SDK 按固定顺序输出与对象字面量的书写顺序无关数组元素为对象buildArgs序列化为 GraphQL 的对象数组字面量[{...}]而非拼接好的KEYVALUE字符串测试即文档该测试文件名是api.spec.ts说明 SDK 的查询构造行为有自动化测试兜底确保生成查询的稳定性。在 Rust / Python / Go 等其他 SDK 中的对应物虽然本文聚焦 TypeScript但BuildArg的语义在各语言 SDK 中是一致的——在 Dagger 的核心 APICore API中dockerBuild的buildArgs参数是一个由{ name, value }组成的列表。使用其他语言 SDK 时只需用该语言的结构体/对象表达相同键值对即可语义完全相同。四、引擎端实现从 GraphQL 参数到容器构建当 TypeScript SDK 发出directory.dockerBuild(...)的 GraphQL 请求后由 Dagger 核心引擎中的目录 Schema 处理。在 core/schema/directory.go 中注册了该解析器dagql.NodeFuncWithDynamicInputs(dockerBuild, s.dockerBuild, s.dockerBuildDynamicInputs). // ... dagql.Arg(buildArgs).Doc(Build arguments to use in the build.),对应的实现函数 directory.go 展示了buildArgs的完整消费链路func (s *directorySchema) dockerBuild(ctx context.Context, parent dagql.ObjectResult[*core.Directory], args dirDockerBuildArgs) (*core.Container, error) { // 1. 确定目标平台默认取当前查询平台可被 platform 参数覆盖 platform : query.Platform() if args.Platform.Valid { platform args.Platform.Value } // 2. 应用 .dockerignore 规则得到真正的构建上下文目录 buildctxDir, err : applyDockerIgnore(ctx, srv, parent, args.Dockerfile) // 3. 加载 secrets 与 SSH socket如果提供 // 4. 将 BuildArg 数组转成内部输入切片交给容器 Build return ctr.Build( ctx, parent, buildctxDirID, args.Dockerfile, collectInputsSlice(args.BuildArgs), args.Target, secrets, // ... ) }其中collectInputsSlice(args.BuildArgs)将 GraphQL 层接收到的BuildArg列表转换为引擎内部使用的输入结构随后Container.Build()在构建时把每个name/value对作为构建参数注入。可以推断buildArgs的每个元素最终都会映射为 BuildKit 构建时的一个--build-arg其行为与 Docker 的ARG/--build-arg语义保持一致。一个值得注意的引擎细节从实现看dockerBuild在真正构建前会先调用applyDockerIgnore处理.dockerignore排除规则core/schema/directory.go因此传给dockerBuild()的目录会被正确过滤后再作为构建上下文。这意味着buildArgs之外构建上下文目录的过滤行为同样会影响最终产物。五、典型使用场景与实战建议场景一按环境参数化构建用BuildArg区分环境一套 Dockerfile 多处复用const envArgs: Recordstring, string { production: { NODE_ENV: production, API_BASE: https://api.example.com }, staging: { NODE_ENV: staging, API_BASE: https://staging.api.example.com }, } const build (env: keyof typeof envArgs) client.host().directory(.).dockerBuild({ buildArgs: Object.entries(envArgs[env]).map(([name, value]) ({ name, value })), })场景二版本号注入将 Git 提交号或发布版本作为构建参数注入产物自描述const gitSha (await client.git(https://github.com/user/repo).branch(main).commit().sha()) await buildCtx.dockerBuild({ buildArgs: [ { name: VERSION, value: gitSha.slice(0, 12) }, { name: BUILD_TIME, value: new Date().toISOString() }, ], })实战建议值是字符串注意转译BuildArg.value的类型是string需要传数字/布尔时请自行String(...)转换值中若包含空格或特殊字符保持字符串原样即可序列化阶段不会丢失。保持参数顺序稳定由上文测试可知SDK 会按固定顺序输出字段但为可读性仍建议按{ name, value }顺序书写。敏感信息不要用 BuildArg构建参数会出现在构建历史与缓存元数据中密钥类信息应改用DirectoryDockerBuildOpts.secrets挂载到/run/secrets/[secret-name]这符合引擎端对 secrets 的专门处理路径。配合ARG声明使用Dockerfile 中未通过ARG声明的变量不会被--build-arg注入请确保BuildArg.name与 Dockerfile 中的ARG名一致。六、关联参考类型别名官方参考BuildArg.md消费方选项类型DirectoryDockerBuildOpts.mdSDK 生成源码类型定义sdk/typescript/src/api/client.gen.tsSDK 查询构造测试sdk/typescript/src/api/test/api.spec.ts引擎端 Schema 实现core/schema/directory.goAPI 模块索引client.gen README总结BuildArg虽然只是一个仅含name与value两个字符串字段的极简类型别名但它是 Dagger TypeScript SDK 中参数化容器构建的基石在类型层面约束构建参数完整性在序列化层以稳定的嵌套对象形式进入 GraphQL 查询在引擎端最终转化为构建时的--build-arg注入。理解它的定义、消费方dockerBuild、序列化规则与引擎执行链路你就能在自己的 Dagger 流水线中写出可复用、可缓存、环境无关的参数化构建逻辑。【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/dagger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表