如何用 Dagger 从 Dockerfile 构建镜像并发布到私有镜像仓库

发布时间:2026/9/15 13:00:03
如何用 Dagger 从 Dockerfile 构建镜像并发布到私有镜像仓库 如何用 Dagger 从 Dockerfile 构建镜像并发布到私有镜像仓库【免费下载链接】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如果你的代码仓库里已经有一份 Dockerfile希望用它构建镜像并把结果推送到需要账号密码的私有镜像仓库例如 Docker Hub、GitHub Container RegistryDagger 的 cookbook 提供了可以直接组合的两块能力Directory.DockerBuild从 Dockerfile 构建镜像以及WithRegistryAuthPublish携带仓库凭据发布到私有 registry。本文把这两块拼成一条完整路径编写一个 Dagger 模块函数从指定目录读取 Dockerfile 构建然后发布到你自己的私有仓库。以下示例以 Go SDK 编写文档同时提供了 Python、TypeScript、PHP 版本对应代码见文末参考链接。运行前需要环境中已安装daggerCLI并把下面的函数放入一个 Dagger 模块中——仓库cookbook/snippets下的各示例目录如 dockerfile 构建 Go 模块都带有dagger.json与入口代码可以作为你创建自己模块时的对照模板。编写模块函数DockerBuild 仓库凭据 Publish先给出 cookbook 中两个被分别文档化的模式再给出本文使用的组合写法。模式一从 Dockerfile 构建并发布的函数// Build and publish image from existing Dockerfile func (m *MyModule) Build( ctx context.Context, // location of directory containing Dockerfile src *dagger.Directory, ) (string, error) { ref, err : src. DockerBuild(). // build from Dockerfile Publish(ctx, ttl.sh/hello-dagger) if err ! nil { return , err } return ref, nil }模式二发布到私有 registry 的函数关键在于WithRegistryAuth(registry, username, password)其中password是*dagger.Secret类型// Publish a container image to a private registry func (m *MyModule) Publish( ctx context.Context, // Registry address registry string, // Registry username username string, // Registry password password *dagger.Secret, ) (string, error) { return dag.Container(). From(nginx:1.23-alpine). WithNewFile( /usr/share/nginx/html/index.html, Hello from Dagger!, dagger.ContainerWithNewFileOpts{Permissions: 0o400}, ). WithRegistryAuth(registry, username, password). Publish(ctx, fmt.Sprintf(%s/%s/my-nginx, registry, username)) }本文的目标场景是把两者串起来镜像来自 Dockerfile而不是From基础镜像 文件操作发布目标是需要鉴权的私有仓库。组合后的完整函数如下package main import ( context fmt dagger/my-module/internal/dagger ) type MyModule struct{} // 从 Dockerfile 构建镜像并发布到私有镜像仓库 func (m *MyModule) Build( ctx context.Context, // location of directory containing Dockerfile src *dagger.Directory, // Registry address registry string, // Registry username username string, // Registry password password *dagger.Secret, ) (string, error) { return src.DockerBuild(). // build from Dockerfile WithRegistryAuth(registry, username, password). Publish(ctx, fmt.Sprintf(%s/%s/app:latest, registry, username)) }其中每个环节都来自上面两个文档化模式DockerBuild()作用于传入的目录该目录内必须有 DockerfileWithRegistryAuth在发布前注入仓库凭据Publish把镜像推到目标引用并返回该引用字符串。末尾的app:latest是示例镜像名与标签请替换为你自己的镜像命名registry/username前缀的引用格式沿用文档示例fmt.Sprintf(%s/%s/my-nginx, registry, username)的写法。运行发布命令文档中的示例把仓库密码放在环境变量PASSWORD中并通过env://PASSWORD传入Dagger 会将其作为Secret读取。运行前需要先设置该环境变量例如 ghcr.io 场景下放 GitHub personal access token文档原文the GitHub personal access token set in thePASSWORDenvironment variable。对组合函数使用 Dagger CLI 的命名参数形式调用dagger call build \ --srchttps://github.com/dockersamples/python-flask-redis \ --registryghcr.io \ --usernameuser \ --passwordenv://PASSWORD--src的值、ghcr.io和user均取自文档示例请替换为你自己的源码位置与仓库账号--src指向包含 Dockerfile 的目录。参数名--registry、--username、--password沿用文档中 私有 registry 发布示例 的 CLI 形式。文档中两个单一模式的原始示例命令示例结果供对照# 从 Dockerfile 构建并发布文档示例目标为 ttl.sh dagger -c build https://github.com/dockersamples/python-flask-redis # 携带凭据发布到 ghcr.io文档示例 dagger -c publish ghcr.io user env://PASSWORD确认发布结果两个文档化函数的返回值都是发布后的镜像引用字符串构建函数中ref, err : src.DockerBuild()...Publish(ctx, ...)成功后返回ref发布函数直接return ...Publish(ctx, ...)得到的字符串。因此判断成功的方式就是dagger call执行完毕且输出为预期的镜像引用例如按上面组合函数构造的ghcr.io/user/app:latest这类引用。如果构建或推送失败函数返回err命令不会输出镜像引用。可选分支Dockerfile 与源码不在同一目录当 Dockerfile 位于另一处例如独立的 dockerfiles 仓库时文档提供了双参数形式函数额外接收dockerfile *dagger.File先WithFile(/src/custom.Dockerfile, dockerfile)把它放进构建上下文再用DockerBuild(dagger.DirectoryDockerBuildOpts{Dockerfile: custom.Dockerfile})指定文件名。对应调用示例文档原文dagger -c build https://github.com/dockersamples/python-flask-redis https://github.com/vimagick/dockerfiles#master:registry-cli/Dockerfile同样的凭据参数可以叠加在这一分支上。另外如果需要一次推送多个 tag 到私有 registry参见 multi-tag 发布示例。适用边界与参考文档中 Dockerfile 构建示例的默认发布目标是ttl.sh/hello-dagger那是一个演示用的临时目标面向私有仓库时必须加上WithRegistryAuth并替换发布引用这正是本文组合函数的做法。密码参数在 API 中是*dagger.Secret类型Go不要以明文参数直接传递CLI 层通过env://PASSWORD从环境变量读取。主要文档入口Builds cookbook、Container Images cookbook。各语言完整示例Go dockerfile 构建、Python dockerfile 构建、Go 私有仓库发布、Python 私有仓库发布。【免费下载链接】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),仅供参考