Docker-песочница для harness.run
Запускайте agent harness внутри Docker-песочницы.
Dagu может запускать Docker-контейнер для всего DAG run или только для одного шага harness.run. Монтирования, переменные окружения, сеть и CLI-провайдер задаются явно в container.
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-releaseRoot-level container дает command и harness шагам общий файловый слой.
Step-level container изолирует одну попытку harness со своим образом и mount.
Если DAGU_CONTAINER_RUNTIME не задан, по умолчанию используется Docker.
Примеры на Alpine проверяют контейнерный путь без вызова model provider.
Область контейнера
Используйте 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-образов.
Сетевой доступ агента
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.
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 сам не должен управлять контейнерами.
Секреты
Credentials не передаются неявно. Передавайте их через container.env или монтируйте каталог, который provider реально читает. Credentials в root-level container видны всем унаследованным шагам в общем контейнере.
Примеры provider
Docker-песочница для harness.run
Соберите Codex runner из базового образа OpenAI и используйте CODEX_HOME или CODEX_API_KEY.
Claude Code в DockerУстановите Claude Code в Node-образ и передайте Anthropic credentials одному шагу.
OpenCode в DockerУстановите OpenCode, смонтируйте auth-каталог и запускайте через harness.run.
Своя CLI в DockerОпишите внутреннюю CLI или wrapper script как custom provider.