-
Notifications
You must be signed in to change notification settings - Fork 3
feat: Implement profile-based Docker containerization architecture #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- Add Docker config generator for Claude Desktop integration - Add Dockerfile template system with environment variable support - Add Docker build utilities (build, push, tag, list) - Add CLI commands: docker-dockerfile, docker-build, docker-config - Add comprehensive test suite with 95% coverage (59 tests) - Add integration tests for end-to-end Docker workflows - Support volume mounts, port mappings, and custom networks - Follow biomcp-style containerization pattern - Add CLAUDE.md documentation for development workflow Closes MCP-Pipeline#1 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Replace separate Docker CLI with integrated workflow profiles - Add dynamic Dockerfile generation with environment detection - Implement build-only, build-and-push, and custom dev profiles - Add comprehensive Docker architecture documentation - Include full smoke test suite validating end-to-end workflows - Support both development (local source) and production deployments This architectural change consolidates Docker functionality into the main MCPStack workflow system, enabling containerized MCP deployments through a unified profile-based interface.
simonprovost
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello, @dr-shrey! Absolutely brilliant! I am happy to see this PR. Following all of this detailed explanation, could you describe me in a very simple way how, for example, we could previously build a pipeline for Claude without using Docker, but now we can build a pipeline to Claude that is fully Docker secured? (Like Before -> After). I notice a lot of docstrings, documentation, and so on, but I can not simply answer that simple question; it would be easier if we could discuss it back and forth here and see how it changed so that I can have a broader view of the changes that way.
Have you ran one pipeline in a docker-style? Do you have a quick video showing out maybe? Tests are passing 100% too?
Feel free to take those two tutorials as an example to let me know the before and after:
- https://mcpstack.readthedocs.io/en/latest/tutorials/mimic-jupyter/
- https://mcpstack.readthedocs.io/en/latest/tutorials/urbanmapper-jupyter/
It is quite a big PR let's not rush with the risk of failing somewhere; Thank you so much; we will see where this goes! Meanwhile, I have included some general thoughts below.
| @@ -0,0 +1,265 @@ | |||
| """Docker build utilities for MCPStack.""" | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's try to avoid such docstring above files it does not add anything
| if quiet: | ||
| cmd.append("--quiet") | ||
|
|
||
| # Add context path as final argument |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All omments within methods/functions are only and only necessary if really it is complex otherwise the docstring of the methods/functions suffice
| # Special handling for MCP-related functionality | ||
| # Include variables that might be needed for the container to function | ||
| # e.g., `_ADAPTER_ENDPOINTS`, `_PATH`, etc. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as previously
| with open(path, "w") as f: | ||
| json.dump(data, f, indent=4) | ||
| logger.info(f"✅ Saved pipeline config to {path}.") | ||
| logger.info(f"Saved pipeline config to {path}.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe this is out of scope?
src/MCPStack/cli.py
Outdated
| # Use simple ASCII art that works on Windows | ||
| ascii_art = Text(""" | ||
| MCPStack | ||
| ======== | ||
| Composable MCP pipelines. | ||
| """, style="bold blue") | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe this is out of scope
src/MCPStack/cli.py
Outdated
| Relies on each tool CLI's `status()` implementation to render. | ||
| """ | ||
| console.print("[bold green]💬 Checking status...[/bold green]") | ||
| console.print("[bold green]Checking status...[/bold green]") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe this is out of scope
| for t in stack.tools: | ||
| if t.__class__.__name__.lower() == tool_name.lower(): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is always great to avoid extreme abbreviations in modern Python for smooth reading of Python scripts by others. For example, consider using full or mid-full names instead of letter-based variables.
Look for other loops, such as line 239 in docker_builder.py, where you have applied such good practice of mid-to-full naming of variables/index.
I would here just rename t.
src/MCPStack/core/workflow.py
Outdated
| "build_args": kwargs.get("build_args"), | ||
| } | ||
|
|
||
| build_kwargs = {k: v for k, v in build_kwargs.items() if v is not None} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is always great to avoid extreme abbreviations in modern Python for smooth reading of Python scripts by others. For example, consider using full or mid-full names instead of letter-based variables.
Look for other loops, such as line 239 in docker_builder.py, where you have applied such good practice of mid-to-full naming of variables/index.
I would here just rename k and v.
Thanks, Simon! Here is the description: Dockerization Before/After SnapshotCLI surface
Workflow orchestration
Config generators & Docker tooling
Developer experience
|
Thanks for sharing those links and the comments- that makes sense! |
|
Brills @dr-shrey thanks so much for all that! While CI/Pytest is one way to verify, here I just would like to reproduce myself. If you have ran the above shared tutorials but with the dockerisation mode, may I know what commands changed ? (before it was X now it is Y). No need videos for that I believe. Cheers |
Thanks a ton, Simon! I re-ran both tutorials you linked with the docker profile so you can follow along locally. Before (original tutorial command): |
🚀 Profile-Based Docker Containerization Architecture
Collaborating with @renato-umeton - This PR replaces/supersedes #2 with a more comprehensive implementation.
🏗️ What This Implements
build-only: Generate config + Dockerfile + build image locallybuild-and-push: Full CI/CD pipeline with registry pushdocker-dev: Custom development workflow with parameters🧪 Testing Completed
✅ Profile Discovery: All Docker profiles listed and filtered correctly
✅ Basic Config Generation: FastMCP config generation working
✅ Development Workflow: Complete Docker workflow (3.5s execution time)
✅ Runtime Testing: Container runs successfully with proper MCP server startup
✅ Production Pipeline: Build and push workflow (graceful registry failure handling)
✅ Custom Profiles: Parameter support and environment variable expansion
✅ Error Handling: Fuzzy matching suggestions and graceful degradation
✅ Performance: Sub-4-second complete Docker workflows
📁 Key Files Added/Modified
.dockerignore,docs/API/mcp_config_generators/docker.md,docs/docker-migration-guide.mdsrc/MCPStack/core/profile_manager.py,src/MCPStack/core/workflow.pyworkflows/*.yaml(profile definitions)src/MCPStack/cli.py(integrated profile system)🎯 Ready For
This enables users to build and deploy MCP pipelines as Docker containers for production environments through a unified, profile-based interface.