Dagger:云原生 CI/CD 工作流 2026 版

Dagger 是 Write Once, Deploy Anywhere 的 CI/CD 框架。Docker 镜像化工作流。支持 Go、Python、Node。

  • ⭐ 11000
  • Go
  • Python
  • Docker
  • Apache 2.0
  • 更新于 2026-05-18

什么是 Dagger? #

Dagger 是 Write Once, Deploy Anywhere 的 CI/CD 框架。用 Go、Python、Node 编写工作流。Docker 镜像化,跨平台运行。

安装 #

CLI 安装 #

# macOS / Linux
curl -L https://dl.dagger.io/dagger/install.sh | sh

# 验证
dagger --version

SDK 安装 #

# Go
go install github.com/dagger/dagger/cmd/dagger@latest

# Python
pip install dagger

# Node
npm install @dagger/dagger

基本概念 #

Cacher(缓存) #

// Dagger 自动缓存步骤结果
// 相同输入,跳过实际执行

容器化 #

// 每个步骤运行在干净容器
// 无副作用,可重现

Python 示例 #

构建管道 #

# main.py
from dagger import Client, dag

async def main(client: Client):
    # 构建步骤
    src = client.host directory(".")
    
    # 安装依赖
    deps = src.directory("src").dockerfile()
    
    # 运行测试
    result = await deps
        .container()
        .exec(["python", "-m", "pytest"])
        .stdout
    
    return result

运行 #

dagger run

Go 示例 #

构建 CI #

// pipeline.go
func Main(ctx context.Context, client *dagger.Client) (*dagger.Container, error) {
    // 获取源码
    src := client.Host().Directory(".")
    
    // 构建镜像
    img, err := src.
        Dockerfile("Dockerfile").
        Build(ctx)
    if err != nil {
        return nil, err
    }
    
    // 推送
    return img.Registry().Push(
        ctx,
        "docker.io/your/image",
        nil,
    )
}

Node.js 示例 #

测试流水线 #

// index.js
import { dag } from "@dagger/dagger"

await dag.host()
  .directory(".")
  .container()
  .from("python:3.11")
  .script("/install.sh")
  .exec(["pytest", "tests/"])
  .then(result => console.log(result.stdout))

CI/CD 管道 #

GitHub Actions #

# .github/workflows/ci.yml
name: CI
on: [push]
jobs:
  ci:
    runs-on: ubuntu-latest
    container: daggerprom/dagger:minimal
    steps:
      - uses: actions/checkout@v3
      - run: dagger run
        env:
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

GitLab CI #

# .gitlab-ci.yml
dagger:
  stage: test
  image: daggerprom/dagger:minimal
  script:
    - dagger run

高级功能 #

并行执行 #

# 多个步骤并行
tasks = [
    client.build_app(),
    client.build_docs(),
    client.run_tests(),
]
results = await asyncio.gather(*tasks)

条件分支 #

result, err := client.Host().
    Directory(".").
    Container().
    From("alpine").
    Exec([]string{"test", "-f", "config.yaml"}).
    Sync(ctx)
    
// 根据结果决定下一步
if result.ExitCode == 0 {
    // 配置文件存在
}

部署到 Cloud #

Dagger Cloud #

# 登录
dagger login

# 部署到 Dagger Cloud
dagger deploy --environment production

连接凭证 #

# 添加 Docker Hub
dagger cloud registry login -u username -p password

# 添加 GitHub
dagger cloud provider add github --token $GITHUB_TOKEN

性能优化 #

缓存策略 #

# 显式控制缓存
result = await container \
    .file("output.txt") \
    .id() \
    .if_changed()  # 基于文件 ID 缓存

矩阵构建 #

# 多平台构建
matrix:
  platform: [linux/amd64, linux/arm64]

常见问题 #

Q: Dagger 的 CI 与 GitHub Actions 哪个更好?

答:Dagger 用代码定义,更灵活。GitHub Actions 用 YAML,配置化。两者可组合。

Q: 如何调试 Dagger 管道?

答:dagger deploy --debug,或本地 dagger run --verbose.

Q: 支持 Secret 管理吗?

答:支持。Dagger Cloud 提供 Secret 管理,CI/CD 可注入。

总结 #

Dagger 把「CI/CD 工作流」变成可读、可复用的代码。Write Once, Deploy Anywhere。


参考:dagger.io 文档 更新:2026-05-18

💬 留言讨论