Docker-песочница для harness.run

Запускайте agent harness внутри Docker-песочницы.

Dagu может запускать Docker-контейнер для всего DAG run или только для одного шага harness.run. Монтирования, переменные окружения, сеть и 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

Root-level container дает command и harness шагам общий файловый слой.

Step-level container изолирует одну попытку harness со своим образом и mount.

Если DAGU_CONTAINER_RUNTIME не задан, по умолчанию используется Docker.

Примеры на Alpine проверяют контейнерный путь без вызова model provider.

01

Область контейнера

Используйте root-level container, когда command и harness шаги должны делить файлы и инструменты. Используйте step-level container, когда только одной agent-попытке нужны runner image, workspace mount и credential.

  • Root-level container применяется к унаследованным command шагам и CLI-based harness.run.
  • Step-level container переопределяет root-level container для конкретного шага.
  • Можно подключиться к уже запущенному именованному контейнеру, но image mode лучше для воспроизводимых runner-образов.
02

Сетевой доступ агента

Codex, Claude Code, OpenCode и похожим hosted agent CLI обычно нужен исходящий сетевой доступ к API провайдера. Dagu задает режим сети контейнера; разрешение или запрет egress настраивается вне Dagu через Docker, Podman, firewall или proxy.

  • Не задавайте container.network, чтобы использовать сеть Docker по умолчанию, или укажите custom network с нужным исходящим доступом.
  • Для allow/deny policy используйте сети Docker или Podman, firewall rules или proxy environment variables.
  • `network: none` подходит только для команд, которые вообще не вызывают внешние сервисы; это не полезный пример для hosted agent.
03

Runtime окружение

Container runtime задается на том Dagu-процессе, который выполняет run: server, scheduler, worker или CLI. Docker выбран по умолчанию, а стандартные переменные Docker, например DOCKER_HOST, продолжают работать.

  • DAGU_CONTAINER_RUNTIME=docker нужен только для явного выбора.
  • Если сам Dagu запущен в Docker, монтируйте Docker socket только в доверенные Dagu workers.
  • Runner-контейнеру agent не нужен Docker socket, если agent сам не должен управлять контейнерами.
04

Секреты

Credentials не передаются неявно. Передавайте их через container.env или монтируйте каталог, который provider реально читает. Credentials в root-level container видны всем унаследованным шагам в общем контейнере.