
Dagger v0.13.1 变更深度解析withoutFiles 批量删除、OCI 注解与 Secret 修复实战指南【免费下载链接】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导读本文基于开源仓库中的 .changes/v0.13.1.md 发布说明围绕 Dagger v0.13.12024-09-18 发布的三项核心改进展开新增的Container.withoutFiles/Directory.withoutFiles批量文件删除 API、Container.withAnnotationOCI 注解能力以及一系列 Secret 与模块加载相关的关键修复。读完本文你将掌握这些新 API 的 schema 定义、参数细节与实战用法并理解其底层实现与集成测试的验证逻辑。版本概览v0.13.1 带来了什么v0.13.1 是 Dagger 在 2024-09-18 发布的次版本补丁聚焦于文件系统操作效率与安全边界修正两个方向新增 3 项核心 APIContainer.withoutFiles、Directory.withoutFiles批量移除文件、Container.withAnnotation设置 OCI 注解修复 4 个问题scratch 目录上Directory.digest计算、跨模块私密 Secret 传递、会话级缓存函数返回 Secret、CLI 打印 Secret 明文。这些变更分别由 jedevc、aluzzardi、TomChv、helderco 等核心维护者提交全部合入主线。下文逐一拆解其源码实现与使用方式。新增 API 一withoutFiles —— 一次调用批量删除多个文件为什么需要 withoutFiles在 v0.13.1 之前删除文件系统内容只能逐条调用withoutFile/withoutDirectory删除 N 个文件需要 N 次 API 往返而withoutFiles允许一次调用移除多个文件无论这些文件位于容器还是目录中。发布说明.changes/v0.13.1.md中明确写道These can be used to remove multiple files from a filesystem in one call.Schema 定义与参数细节在 core/schema/container.go 中Container.withoutFiles被注册为可持久化的 dagql NodeFuncwithoutFiles(paths: [String!]!, expand: Boolean): Container!paths要移除的文件路径列表例如[foo.txt, /root/.ssh/config]expand可选布尔参数为true时按容器内当前环境变量展开路径中的${VAR}或$VAR例如/$VAR/foo.txt。Directory.withoutFiles的注册位置在 core/schema/directory.go签名简化为withoutFiles(paths: [String!]!): Directory!参数paths即待移除文件的路径列表如[/file.txt]。两者的解析结构体分别为containerWithoutFilesArgs与withoutFilesArgs后者直接声明为{ Paths []string }见 core/schema/directory.go。实战用法Go SDK 示例结合仓库内 SDK 生成代码如 core/integration/testdata/generators/hello-with-generators/toolchain/internal/dagger/dagger.gen.goContainer.WithoutFiles的可选参数结构体为// ContainerWithoutFilesOpts contains options for Container.WithoutFiles type ContainerWithoutFilesOpts struct { // Replace ${VAR} or $VAR in the value of paths according to // the current environment variables defined in the container // (e.g. /$VAR/foo.txt). Expand bool }典型调用方式参考 core/integration/container_test.go 的集成测试用例// 批量删除两个文件 out, err : ctr. WithoutFiles([]string{xyz, /ual}). WithExec([]string{ls, -1}). Stdout(ctx) // 路径支持通配符模式 out, err : ctr. WithoutFiles([]string{xyz, *oo}). WithExec([]string{ls, -1}). Stdout(ctx) // 开启环境变量展开 _, err : c.Container(). From(alpine:latest). WithFile(/some-path/${foo}/some-file.txt, c.Directory().WithNewFile(/some-file.txt, contents in foo file).File(/some-file.txt), ). WithoutFiles([]string{/some-path/${foo}/some-file.txt}, dagger.ContainerWithoutFilesOpts{Expand: true}). WithExec([]string{ls, /some-path/bar/some-file.txt}).Stdout(ctx)上述测试还覆盖了一个细节删除不存在的文件不会报错no error if not exists 子测试这保证了批量删除在真实流水线中的健壮性。Directory.WithoutFiles的用法与之对称集成测试见 core/integration/directory_test.gofilesDir : c.Directory(). WithNewFile(some-file, some-content). WithNewFile(some-file-2, some-content). WithNewFile(some-dir/sub-file, sub-content). WithoutFiles([]string{some-file, some-file-2})底层实现要点从 core/container.go 的持久化逻辑可以看到withoutFiles与既有的withoutDirectory、withoutFile共用persistedContainerWithoutPathLazy持久化结构体withoutDirectory/withoutFile/withoutFiles三个 case 合并处理意味着该操作同样走 Dagger 的惰性状态LazyState机制支持会话内去重与缓存。Directory.withoutFiles的实现在 core/schema/directory.go 中通过core.CurrentDagqlServer获取服务器实例后返回新的*core.Directory对象符合不可变快照链的建模方式。新增 API 二withAnnotation —— 为容器设置 OCI 注解用途与 SchemaOCI 镜像规范允许通过注解Annotation携带任意元数据作者、版本、许可证等。v0.13.1 新增Container.withAnnotation(name, value)用于在当前容器快照上追加一条 OCI 注解其 schema 注册在 core/schema/container.gowithAnnotation(name: String!, value: String!): Container!两个参数含义如下name注解名称annotation 的 keyvalue注解的值。同时提供了配套的反向操作withoutAnnotation(name)用于移除一条已设置的注解core/schema/container.go。当容器被导出为镜像时这些注解会随镜像元数据一起写入。底层数据结构与持久化在 core/container.go 中容器快照结构体持有// OCI annotations Annotations []containerutil.ContainerAnnotation注解定义在containerutil包中字段为名称与值对。围绕注解的三处关键实现快照克隆cloneContainerForSchemaChild在派生容器时通过slices.Clone(parent.Self().Annotations)保留父容器的注解core/container.go持久化Annotations被序列化进容器持久化负载并在恢复时再次slices.Clonecore/container.go、core/container.go惰性求值ContainerWithAnnotationLazy/ContainerWithoutAnnotationLazy两个惰性类型core/container.go分别承载withAnnotation与withoutAnnotation的求值逻辑如 core/container.go 所示通过LazyState.Evaluate在调用 Container.withAnnotation 时物化父容器状态再叠加注解使注解操作具备可持久化、可缓存的能力。实战示例ctr, err : dag.Container(). From(alpine:latest). WithAnnotation(org.example.version, 1.2.3). WithAnnotation(org.example.team, platform). WithExec([]string{echo, hello}). Export(ctx, ./out.tar)构建并导出后镜像 tar 的 manifest 中即包含上述注解条目。如需清理可链式调用WithoutAnnotation(org.example.team)。新增能力ignore 与 defaultPath 在 Git 模块加载下协同生效v0.13.1 修复了ignore与defaultPath组合在从 Git 获取模块而非本地目录时不生效的问题。这意味着当模块通过 Git 源加载时defaultPath指定的默认目录同样会应用ignore过滤规则。仓库中的相关测试core/integration/module_path_inputs_test.go系统性地验证了defaultPath、ignore、.gitignore与显式过滤器如何共同塑造传入模块的 Directory / File / GitRepository 输入。以 dang 模块测试为例core/integration/testdata/modules/dang/test-directives/main.dangpub withPositionalIgnore( source: Directory! defaultPath(./fixtures/ignore-positional) ignorePatterns([*.tmp, *.log]), ): [String!]! { source.entries }可见defaultPath与忽略规则位置参数形式ignorePatterns([...])或命名参数形式ignorePatterns(patterns: [...])可以同时作用于同一输入参数withoutFiles的出现进一步让此类过滤逻辑可以在拿到目录后再按需二次裁剪。修复项详解Digest、Secret 与 CLI 安全修复一scratch 目录上的 Directory.digest此前在空目录scratch directory上调用Directory.digest可能出错v0.13.1 修复了该边界情况。核心实现位于 core/directory.goDigest方法先通过dir.Snapshot.GetOrEval求值目录快照再计算摘要该修复确保快照为空scratch时也能稳定返回合法的内容摘要而不是抛错。修复二与三Secret 跨模块传递与会话级缓存v0.13.1 一次性修复了两个相互关联的 Secret 问题允许私密 Secret 在不同模块之间传递此前模块 A 创建的dagger.Secret无法安全地作为参数传给模块 B现在已打通处理返回 Secret 的会话级缓存函数当某个被会话级缓存session-wide cached的函数返回 Secret 时缓存机制不再破坏其私密性语义。仓库中的集成测试core/integration/cross_session_test.go覆盖了相关场景例如cached set-secret transfers验证跨会话缓存下 Secret 值仍按预期重新生成并传递different secrets with same name do not cache验证同名但不同值的 Secret 不会错误地共享缓存从而避免泄密secret uri plaintext 等用例则验证了明文 Secret URI 的处理路径。修复四CLI 不再把 Secret 明文打印到屏幕此前在 CLI 中调用返回dagger.Secret的函数时可能把 Secret 的明文值直接打印到终端v0.13.1 修正了这一安全隐患。从 internal/cmd/dagger/flags.go 可以看到 CLI 对 Secret 参数的处理方式secretValue实现pflag.Value接口从名称与明文值构建dagger.SecretType()返回SecretSecret 的明文只用于构造 Secret 对象本身而输出阶段则被安全遮蔽保证敏感信息不出现在标准输出中。升级建议与验证升级版本将 Dagger Engine 与 CLI 升级到 v0.13.1 或更高版本后上述 API 才可用验证方式运行仓库中的相关集成测试可确认行为重点用例集中在core/integration/container_test.go容器WithoutFiles基础、通配符、绝对路径、环境变量展开core/integration/directory_test.go目录WithoutFilescore/integration/cross_session_test.go跨会话 Secret 缓存语义最佳实践批量清理文件优先使用withoutFiles而非循环withoutFile为镜像附加元数据时使用withAnnotation在生产流水线中始终确认 Secret 不会进入日志或终端输出。小结v0.13.1 虽为次版本却在文件系统操作withoutFiles、镜像元数据withAnnotation、模块加载过滤ignoredefaultPath与安全边界Secret 传递、缓存、CLI 输出四个维度补足了关键能力。理解这些变更的实现细节惰性持久化、快照克隆、跨会话缓存语义有助于你在自己的 Dagger 流水线中更高效、更安全地组合这些 API。【免费下载链接】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),仅供参考