3.1 KiB
3.1 KiB
Universal Worker Agent: Phase 4 — Docker Compose Integration
Date: 2026-02-05
Phase: 4 of 7
Scope: Docker Compose integration for agent-based workers
Summary
Added Docker Compose infrastructure to make it trivial to add agent-based workers to an Attune deployment. Users can now inject the statically-linked attune-agent binary into any container image via a shared volume, turning it into a fully functional Attune worker with auto-detected runtimes — no Dockerfiles, no Rust compilation.
Changes
docker-compose.yaml
- Added
init-agentservice betweeninit-packsandrabbitmq- Builds from
docker/Dockerfile.agent(target:agent-init) - Copies the statically-linked binary to the
agent_binvolume at/opt/attune/agent/attune-agent - Runs once (
restart: "no") and completes immediately
- Builds from
- Added
agent_binnamed volume to the volumes section
docker-compose.agent.yaml (new)
- Override file with example agent-based worker services
- Active (uncommented):
worker-rubyusingruby:3.3-slim - Commented templates: Python 3.12, NVIDIA CUDA GPU, and custom image workers
- All workers follow the same pattern: mount
agent_binread-only, useattune-agentas entrypoint, share standard volumes
Makefile
- Added
docker-up-agenttarget:docker compose -f docker-compose.yaml -f docker-compose.agent.yaml up -d - Added
docker-down-agenttarget: correspondingdowncommand - Updated
.PHONYand help text
docs/QUICKREF-agent-workers.md (new)
- Quick-reference guide for adding agent-based workers
- Covers: how it works, quick start (override file vs docker-compose.override.yaml), required volumes, required environment variables, runtime auto-detection, testing detection, examples (Ruby, Node.js, GPU, multi-runtime), comparison table (traditional vs agent workers), troubleshooting
Usage
# Start everything including the Ruby agent worker
make docker-up-agent
# Or manually
docker compose -f docker-compose.yaml -f docker-compose.agent.yaml up -d
# Stop
make docker-down-agent
Adding a new runtime worker is ~12 lines of YAML in docker-compose.override.yaml:
services:
worker-my-runtime:
image: my-org/my-image:latest
depends_on:
init-agent:
condition: service_completed_successfully
# ... standard health checks
entrypoint: ["/opt/attune/agent/attune-agent"]
volumes:
- agent_bin:/opt/attune/agent:ro
- packs_data:/opt/attune/packs:ro
- runtime_envs:/opt/attune/runtime_envs
- artifacts_data:/opt/attune/artifacts
- ${ATTUNE_DOCKER_CONFIG_PATH:-./config.docker.yaml}:/opt/attune/config/config.yaml:ro
networks:
- attune-network
Dependencies
- Requires: Phase 1 (agent binary build infrastructure) —
docker/Dockerfile.agentmust exist - Requires: Phase 3 (WorkerService dual-mode refactor) — agent auto-detection and lazy env setup
Next Steps
- Phase 5: API binary download endpoint (
GET /api/v1/agent/binary) - Phase 6: Database runtime registry extensions (runtime template packs)
- Phase 7: Kubernetes support (InitContainer pattern, Helm chart)