# ============================================================================= # Orchestrator - Docker Hardened Image (DHI) # ============================================================================= # API Server + Agent Spawner using DHI Python 3.13 # ============================================================================= FROM dhi.io/python:3.13-debian13-dev # Install dependencies + Docker CLI RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ ca-certificates \ git \ gnupg \ lsb-release \ && rm -rf /var/lib/apt/lists/* # Install Docker CLI (for spawning agent containers) # Note: Using 'trixie' for Debian 13, fallback to bookworm if not available RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ && DEBIAN_CODENAME=$(lsb_release -cs) \ && if [ "$DEBIAN_CODENAME" = "trixie" ]; then DEBIAN_CODENAME="bookworm"; fi \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian ${DEBIAN_CODENAME} stable" > /etc/apt/sources.list.d/docker.list \ && apt-get update \ && apt-get install -y docker-ce-cli \ && rm -rf /var/lib/apt/lists/* # Install Node.js 22 (for building agent image) RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* # Install uv for Python package management COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv WORKDIR /app # Copy project files COPY roboco /app/roboco COPY agents /app/agents COPY docker /app/docker COPY pyproject.toml uv.lock alembic.ini README.md /app/ COPY alembic /app/alembic # Install Python dependencies # Increase timeout for large NVIDIA packages (674MB cudnn, 858MB torch) ENV UV_HTTP_TIMEOUT=300 ENV UV_CONCURRENT_DOWNLOADS=4 RUN uv python install 3.13 && uv sync --frozen --python 3.13 # Expose API port EXPOSE 8000 # Start orchestrator WITHOUT spawning agents - the smart dispatcher will spawn # agents on-demand when work is available (avoiding wasteful spawns). # To manually spawn agents at startup, override: docker run ... roboco-orchestrator --spawn main-pm ENTRYPOINT ["uv", "run", "python", "-m", "roboco.cli"] CMD []