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 中的凭据会被共享容器内所有继承步骤读取。