From 9749b222f1c9ee1210f334a4b1084167c47b50c4 Mon Sep 17 00:00:00 2001 From: Zeel Date: Sat, 28 Mar 2026 19:29:37 -0400 Subject: [PATCH] feat: add Dockerfile and docker-compose for local development --- .dockerignore | 19 ++++++++++++ CONTRIBUTING.md | 27 +++++++++++++++++ Dockerfile | 52 ++++++++++++++++++++++++++++++++ docker-compose.yml | 47 +++++++++++++++++++++++++++++ scripts/docker/dev-entrypoint.sh | 13 ++++++++ scripts/docker/run-tests.sh | 17 +++++++++++ 6 files changed, 175 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 scripts/docker/dev-entrypoint.sh create mode 100644 scripts/docker/run-tests.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..b2d6972d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +.git +.github +.venv +**/.venv +**/__pycache__ +**/.pytest_cache +**/.mypy_cache +**/.ruff_cache +**/.coverage +**/htmlcov +**/build +**/dist +**/*.egg-info +**/node_modules +.DS_Store +.idea +.vscode +coverage.xml +node_modules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e954c0f9..2e32307d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,6 +49,33 @@ pip install -e "packages/agent-lightning[dev]" pytest ``` +### Docker Quickstart + +If you prefer a containerized development environment, use the root Docker +configuration. The image includes Python 3.11, Node.js 22, the core editable +Python packages in this monorepo, and the TypeScript SDK dependencies. + +```bash +# Build and start the development container +docker compose up --build dev + +# Open a shell in the running container +docker compose exec dev bash + +# Run the full test suite +docker compose run --rm test +``` + +The repository is bind-mounted into `/workspace`, so Python source changes are +available immediately without rebuilding the image. If you update package +metadata or dependency definitions, rebuild with `docker compose build`. + +To launch the optional Agent Hypervisor dashboard: + +```bash +docker compose --profile dashboard up --build dashboard +``` + ### Package Structure This is a mono-repo with seven packages: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..6598b27c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,52 @@ +# syntax=docker/dockerfile:1.7 + +ARG PYTHON_VERSION=3.11 + +FROM python:${PYTHON_VERSION}-slim AS base + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +ENV DEBIAN_FRONTEND=noninteractive \ + PIP_NO_CACHE_DIR=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + NODE_MAJOR=22 + +WORKDIR /workspace + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bash \ + build-essential \ + ca-certificates \ + curl \ + git \ + && curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash - \ + && apt-get install -y --no-install-recommends nodejs \ + && python -m pip install --upgrade pip setuptools wheel \ + && rm -rf /var/lib/apt/lists/* + +FROM base AS dev + +COPY . /workspace + +RUN python -m pip install --no-cache-dir \ + -e "packages/agent-os[full,dev]" \ + -e "packages/agent-mesh[agent-os,dev,server]" \ + -e "packages/agent-hypervisor[api,dev,nexus]" \ + -e "packages/agent-runtime" \ + -e "packages/agent-sre[api,dev]" \ + -e "packages/agent-compliance" \ + -e "packages/agent-marketplace[cli,dev]" \ + -e "packages/agent-lightning[agent-os,dev]" \ + && python -m pip install --no-cache-dir \ + -r packages/agent-hypervisor/examples/dashboard/requirements.txt \ + && cd /workspace/packages/agent-mesh/sdks/typescript \ + && npm ci + +ENTRYPOINT ["bash", "/workspace/scripts/docker/dev-entrypoint.sh"] +CMD ["sleep", "infinity"] + +FROM dev AS test + +CMD ["pytest"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..8ff22173 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,47 @@ +services: + dev: + build: + context: . + target: dev + command: ["sleep", "infinity"] + init: true + stdin_open: true + tty: true + working_dir: /workspace + volumes: + - .:/workspace + - typescript_node_modules:/workspace/packages/agent-mesh/sdks/typescript/node_modules + + test: + build: + context: . + target: test + command: ["bash", "/workspace/scripts/docker/run-tests.sh"] + init: true + user: "1000:1000" + working_dir: /workspace + volumes: + - .:/workspace + - typescript_node_modules:/workspace/packages/agent-mesh/sdks/typescript/node_modules + + dashboard: + profiles: ["dashboard"] + build: + context: . + target: dev + command: + - streamlit + - run + - packages/agent-hypervisor/examples/dashboard/app.py + - --server.address=0.0.0.0 + - --server.port=8501 + init: true + ports: + - "8501:8501" + working_dir: /workspace + volumes: + - .:/workspace + - typescript_node_modules:/workspace/packages/agent-mesh/sdks/typescript/node_modules + +volumes: + typescript_node_modules: diff --git a/scripts/docker/dev-entrypoint.sh b/scripts/docker/dev-entrypoint.sh new file mode 100644 index 00000000..d450e3c0 --- /dev/null +++ b/scripts/docker/dev-entrypoint.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +sdk_dir="/workspace/packages/agent-mesh/sdks/typescript" + +if [[ -f "${sdk_dir}/package.json" && ! -d "${sdk_dir}/node_modules" ]]; then + echo "Installing TypeScript SDK dependencies..." + cd "${sdk_dir}" + npm ci + cd /workspace +fi + +exec "$@" diff --git a/scripts/docker/run-tests.sh b/scripts/docker/run-tests.sh new file mode 100644 index 00000000..8573795d --- /dev/null +++ b/scripts/docker/run-tests.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +packages=( + "packages/agent-os" + "packages/agent-mesh" + "packages/agent-hypervisor" + "packages/agent-sre" + "packages/agent-compliance" +) + +for package_dir in "${packages[@]}"; do + echo + echo "==> Testing ${package_dir}" + cd "/workspace/${package_dir}" + pytest tests/ -q --tb=short +done \ No newline at end of file