Skip to content

Container bloat: Runner image 65GB due to incorrect build context #598

@jeremyeder

Description

@jeremyeder

Summary

The vteam_claude_runner container image was bloated to 65GB in production (3.7GB locally). Root cause: incorrect Docker build context copying development artifacts including .venv directories (432MB) and unrelated components.

Fix: Added .dockerignore, corrected build context path, and updated COPY command.

Impact:

  • Build context: 413MB → 70MB (83% reduction)
  • Image size: 3.7GB → 2.8GB (25%+ reduction, potentially 95% in CI/CD)

Root Cause

The build context was set to ./components/runners/ (parent directory) instead of ./components/runners/claude-code-runner/, causing Docker to copy:

  • 3 virtual environments (.venv, .venv-langfuse, venv/) - 432 MB
    • claude_agent_sdk/_bundled/claude - 173 MB
    • macOS binaries (.so files) - useless in Linux containers
    • Multiple ruff binaries - 22-29 MB each
  • mcp-ambient-server/ subdirectory - 109 MB (unrelated component)
  • Test files, lock files, and other dev artifacts
📊 Build Context Analysis (from diagnosis script)
Current (incorrect) build context: components/runners/
541M    total

Top files copied:
173M    .venv/lib/python3.13/site-packages/claude_agent_sdk/_bundled/claude
29M     mcp-ambient-server/.venv/bin/ruff
22M     .venv/bin/ruff
20M     .venv/lib/python3.13/site-packages/cryptography/hazmat/bindings/_rust.abi3.so
20M     mcp-ambient-server/venv/lib/python3.14/site-packages/cryptography/...

Build context transfer:

  • Current (incorrect): 413.98 MB
  • Fixed (correct): 70.86 MB

Changes Made

1. Added .dockerignore

File: components/runners/claude-code-runner/.dockerignore

Excludes:

  • Virtual environments (.venv/, .venv-*/, venv/)
  • Tests and coverage files
  • Lock files (uv.lock)
  • IDE files, logs, docs

2. Fixed Dockerfile

File: components/runners/claude-code-runner/Dockerfile (line 64)

- COPY claude-code-runner /app/claude-runner
+ COPY . /app/claude-runner

3. Updated GitHub Actions Workflow

File: .github/workflows/components-build-deploy.yml (line 102)

  - name: claude-code-runner
-   context: ./components/runners
+   context: ./components/runners/claude-code-runner
    image: quay.io/ambient_code/vteam_claude_runner
    dockerfile: ./components/runners/claude-code-runner/Dockerfile

4. Updated Makefile

File: Makefile (line 138-142)

  build-runner:
-   @cd components/runners && $(CONTAINER_ENGINE) build ... -f claude-code-runner/Dockerfile .
+   @$(CONTAINER_ENGINE) build ... -f components/runners/claude-code-runner/Dockerfile \
+       components/runners/claude-code-runner

Expected Results

After this fix:

  • ✅ Build context: ~70 MB (vs 400+ MB)
  • ✅ Image size: 2.5-2.8 GB (vs 65 GB or 3.7+ GB)
  • ✅ Faster builds (less context transfer)
  • ✅ No dev artifacts in production images

The 2.8 GB final size is normal for this stack:

  • Base image (UBI9 Python 3.11): ~600 MB
  • System packages (git, gh, Node.js): ~200 MB
  • Python deps (160 packages): ~1.5 GB (anthropic[vertex], langfuse, fastapi, etc.)

Testing

A diagnosis script was created to reproduce and verify the fix locally. See attached files for:

  • Full diagnosis report
  • Build logs (before/after)
  • Layer-by-layer comparison
🔍 How to verify the fix locally
cd ~/repos/platform

# Check build context size
tar -czf - -C components/runners/claude-code-runner . | wc -c | numfmt --to=iec-i

# Should show ~70-120 MB (vs 150+ MB before)

# Build image
docker build \
    -t vteam_claude_runner:test \
    -f components/runners/claude-code-runner/Dockerfile \
    components/runners/claude-code-runner/

# Check size
docker images vteam_claude_runner:test
# Should show ~2.5-2.8 GB

Action Items

  • Add .dockerignore file
  • Update Dockerfile COPY command
  • Update GitHub Actions workflow context
  • Update Makefile build context
  • Monitor next CI/CD build for size verification
  • Update documentation if needed

Related

Commit: (will be added after PR)


cc: @jeder

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions