harness.run 的 Docker 沙箱

在 Docker 沙箱中运行 agent harness。

Dagu 可以为整个 DAG 运行启动一个 Docker 容器,也可以只为一个 harness.run 步骤启动容器。文件挂载、环境变量、网络访问和 provider CLI 都由 container 配置明确指定。

共享 Docker 沙箱
type: graph

container:
  image: alpine:3.20
  pull_policy: missing
  working_dir: /workspace
  volumes:
    - .:/workspace
  env:
    - SMOKE_TOKEN=container-env-ok

harnesses:
  shell:
    binary: sh
    prefix_args:
      - -c
    prompt_mode: arg

steps:
  - id: write_file
    run: echo "from command step" > shared.txt

  - id: read_file
    action: harness.run
    with:
      provider: shell
      prompt: |
        set -eu
        cat shared.txt
        echo "SMOKE_TOKEN=$SMOKE_TOKEN"
        cat /etc/alpine-release

根级 container 让 command 步骤和 harness 步骤共享同一个文件系统。

步骤级 container 用独立镜像和挂载隔离一次 harness 尝试。

未设置 DAGU_CONTAINER_RUNTIME 时,Docker 是默认运行时。

Alpine 示例不调用模型 provider,只验证容器路径。

01

容器作用域

当 command 步骤和 harness 步骤需要共享文件和工具时,使用根级 container。当只有一次 agent 尝试需要 runner 镜像、workspace 挂载和凭据时,使用步骤级 container。

  • 根级 container 会应用到继承它的 command 步骤和基于 CLI 的 harness.run 步骤。
  • 步骤级 container 会在该步骤覆盖根级 container。
  • 也可以连接已有的命名容器,但 image 模式更适合可复现的 agent runner。
02

Agent 网络访问

Codex、Claude Code、OpenCode 等托管 agent CLI 通常需要出站网络访问 provider API。Dagu 设置的是容器网络模式;允许或拒绝出站访问应在 Docker、Podman、防火墙或代理配置中完成。

  • 使用 Docker 默认网络时省略 container.network;也可以指定一个具备所需出站访问的自定义网络。
  • 允许/拒绝策略请使用 Docker 或 Podman 网络、防火墙规则,或代理环境变量。
  • `network: none` 只适合完全不调用外部服务的命令,不适合作为托管 agent 示例。
03

运行时环境

在真正执行运行的 Dagu 进程上设置容器运行时:server、scheduler、worker 或 CLI。Docker 默认启用,DOCKER_HOST 等标准 Docker 变量仍然有效。

  • 只有需要显式声明时才设置 DAGU_CONTAINER_RUNTIME=docker。
  • 如果 Dagu 本身运行在 Docker 中,只把 Docker socket 挂载到受信任的 Dagu worker。
  • 除非 agent 本身要管理容器,否则 runner 容器不需要 Docker socket。
04

凭据

凭据不会自动传入。用 container.env 传递,或挂载 provider 实际读取的凭据目录。根级 container 中的凭据会被共享容器内所有继承步骤读取。