claude-mpm 4.16.0__py3-none-any.whl → 4.20.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +255 -23
- claude_mpm/agents/PM_INSTRUCTIONS.md +40 -0
- claude_mpm/agents/agent_loader.py +4 -4
- claude_mpm/agents/templates/engineer.json +5 -1
- claude_mpm/agents/templates/python_engineer.json +8 -3
- claude_mpm/agents/templates/rust_engineer.json +12 -7
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/mpm_init.py +109 -24
- claude_mpm/cli/commands/skills.py +434 -0
- claude_mpm/cli/executor.py +2 -0
- claude_mpm/cli/parsers/base_parser.py +7 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/startup.py +57 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-init.md +112 -6
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/constants.py +12 -0
- claude_mpm/core/config.py +42 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/services/agents/auto_config_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/local_template_manager.py +1 -1
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_resume_helper.py +352 -0
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/mcp_config_manager.py +7 -131
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/unified/deployment_strategies/local.py +1 -1
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/agent_skills_injector.py +331 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +75 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +184 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +107 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +146 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +118 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +177 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +175 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +213 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +314 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +227 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +74 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +32 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +328 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +150 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +372 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +209 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +302 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +111 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +65 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +567 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +123 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +304 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +96 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +40 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +107 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +97 -9
- claude_mpm/skills/skills_registry.py +351 -0
- claude_mpm/skills/skills_service.py +730 -0
- claude_mpm/utils/agent_dependency_loader.py +2 -2
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.20.3.dist-info}/METADATA +181 -32
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.20.3.dist-info}/RECORD +130 -48
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.20.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.20.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.20.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.20.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Verification Patterns
|
|
2
|
+
|
|
3
|
+
Complete patterns for verifying different types of claims before making them.
|
|
4
|
+
|
|
5
|
+
## Test Verification
|
|
6
|
+
|
|
7
|
+
**Correct Pattern:**
|
|
8
|
+
```
|
|
9
|
+
1. Run full test suite: pytest tests/
|
|
10
|
+
2. Read complete output
|
|
11
|
+
3. Count: 34 tests, 34 passed, 0 failed
|
|
12
|
+
4. Claim: "All 34 tests pass"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Incorrect Patterns:**
|
|
16
|
+
- ❌ "Should pass now" (no evidence)
|
|
17
|
+
- ❌ "Looks correct" (subjective)
|
|
18
|
+
- ❌ "Tests were passing earlier" (stale)
|
|
19
|
+
- ❌ "I fixed the issue" (assumes, doesn't verify)
|
|
20
|
+
|
|
21
|
+
**Evidence Required:**
|
|
22
|
+
- Full test command executed
|
|
23
|
+
- Complete output visible
|
|
24
|
+
- Exact pass/fail counts
|
|
25
|
+
- Exit code confirmed (0 = success)
|
|
26
|
+
|
|
27
|
+
## Regression Test Verification (TDD Red-Green Cycle)
|
|
28
|
+
|
|
29
|
+
**Correct Pattern:**
|
|
30
|
+
```
|
|
31
|
+
1. Write regression test
|
|
32
|
+
2. Run test → MUST FAIL (RED)
|
|
33
|
+
3. Implement fix
|
|
34
|
+
4. Run test → MUST PASS (GREEN)
|
|
35
|
+
5. Revert fix temporarily
|
|
36
|
+
6. Run test → MUST FAIL AGAIN (confirms test works)
|
|
37
|
+
7. Restore fix
|
|
38
|
+
8. Run test → MUST PASS (final confirmation)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Why Red-Green-Red-Green?**
|
|
42
|
+
- First RED: Confirms test catches the bug
|
|
43
|
+
- GREEN: Confirms fix works
|
|
44
|
+
- Second RED: Confirms test isn't passing by accident
|
|
45
|
+
- Final GREEN: Confirms fix is stable
|
|
46
|
+
|
|
47
|
+
**Incorrect Patterns:**
|
|
48
|
+
- ❌ "I've written a regression test" (didn't verify it fails)
|
|
49
|
+
- ❌ Test passes on first run (never confirmed it catches bug)
|
|
50
|
+
- ❌ Single pass without reverting (could be false positive)
|
|
51
|
+
|
|
52
|
+
## Build Verification
|
|
53
|
+
|
|
54
|
+
**Correct Pattern:**
|
|
55
|
+
```
|
|
56
|
+
1. Run full build: make build
|
|
57
|
+
2. Read complete output
|
|
58
|
+
3. Check exit code: echo $? → 0
|
|
59
|
+
4. Verify artifacts created: ls dist/
|
|
60
|
+
5. Claim: "Build succeeds, artifacts in dist/"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Incorrect Patterns:**
|
|
64
|
+
- ❌ "Linter passed, so build should work" (linter ≠ compiler)
|
|
65
|
+
- ❌ "No errors in logs" (didn't actually build)
|
|
66
|
+
- ❌ "Build was working earlier" (stale verification)
|
|
67
|
+
|
|
68
|
+
**Common Gotchas:**
|
|
69
|
+
- Linter passing ≠ compilation passing
|
|
70
|
+
- TypeScript errors ≠ build errors
|
|
71
|
+
- Local build ≠ CI build
|
|
72
|
+
- Dev build ≠ production build
|
|
73
|
+
|
|
74
|
+
## Linter Verification
|
|
75
|
+
|
|
76
|
+
**Correct Pattern:**
|
|
77
|
+
```
|
|
78
|
+
1. Run linter: ruff check .
|
|
79
|
+
2. Read full output
|
|
80
|
+
3. Count violations: 0 errors, 0 warnings
|
|
81
|
+
4. Check exit code: 0
|
|
82
|
+
5. Claim: "Linter clean (0 violations)"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Incorrect Patterns:**
|
|
86
|
+
- ❌ "Fixed the obvious issues" (partial check)
|
|
87
|
+
- ❌ "Linter passed on one file" (not comprehensive)
|
|
88
|
+
- ❌ "Should be clean now" (no verification)
|
|
89
|
+
|
|
90
|
+
## Bug Fix Verification
|
|
91
|
+
|
|
92
|
+
**Correct Pattern:**
|
|
93
|
+
```
|
|
94
|
+
1. Document original symptom
|
|
95
|
+
2. Create reproduction steps
|
|
96
|
+
3. Run reproduction → FAILS (confirms bug)
|
|
97
|
+
4. Implement fix
|
|
98
|
+
5. Run reproduction → PASSES
|
|
99
|
+
6. Run full test suite → PASSES (no regressions)
|
|
100
|
+
7. Claim: "Bug fixed, verified with reproduction and tests"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Incorrect Patterns:**
|
|
104
|
+
- ❌ "Code changed, bug should be fixed" (assumes)
|
|
105
|
+
- ❌ "Logic looks correct" (theory, not evidence)
|
|
106
|
+
- ❌ "Can't reproduce anymore" (didn't verify with test)
|
|
107
|
+
|
|
108
|
+
## Requirements Verification
|
|
109
|
+
|
|
110
|
+
**Correct Pattern:**
|
|
111
|
+
```
|
|
112
|
+
1. Re-read original requirements
|
|
113
|
+
2. Create line-by-line checklist
|
|
114
|
+
3. Verify each requirement individually
|
|
115
|
+
4. Document evidence for each
|
|
116
|
+
5. Report: "5/5 requirements met" OR "4/5 met, missing X"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Incorrect Patterns:**
|
|
120
|
+
- ❌ "Tests pass, so requirements met" (tests ≠ requirements)
|
|
121
|
+
- ❌ "I implemented what was asked" (subjective)
|
|
122
|
+
- ❌ "Phase complete" (vague, no checklist)
|
|
123
|
+
|
|
124
|
+
## Agent Delegation Verification
|
|
125
|
+
|
|
126
|
+
**Correct Pattern:**
|
|
127
|
+
```
|
|
128
|
+
1. Agent reports: "Task complete"
|
|
129
|
+
2. Check version control diff: git diff
|
|
130
|
+
3. Read all changes made
|
|
131
|
+
4. Verify changes match task requirements
|
|
132
|
+
5. Run verification commands (tests, build, etc.)
|
|
133
|
+
6. Report actual state: "Agent made changes to X, Y verified"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Incorrect Patterns:**
|
|
137
|
+
- ❌ Trusting agent success report
|
|
138
|
+
- ❌ "Agent said success, moving on"
|
|
139
|
+
- ❌ Not checking actual changes made
|
|
140
|
+
|
|
141
|
+
## Deployment Verification
|
|
142
|
+
|
|
143
|
+
**Correct Pattern:**
|
|
144
|
+
```
|
|
145
|
+
1. Deploy to environment
|
|
146
|
+
2. Check deployment logs: SUCCESS
|
|
147
|
+
3. Verify endpoint accessible: curl https://...
|
|
148
|
+
4. Check application logs: No errors
|
|
149
|
+
5. Run smoke tests on deployed version
|
|
150
|
+
6. Claim: "Deployed successfully, endpoint responding"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Incorrect Patterns:**
|
|
154
|
+
- ❌ "Deployment command succeeded" (didn't check endpoint)
|
|
155
|
+
- ❌ "Should be live now" (no verification)
|
|
156
|
+
- ❌ "Deployed to staging" (didn't verify it works)
|
|
157
|
+
|
|
158
|
+
## Performance Verification
|
|
159
|
+
|
|
160
|
+
**Correct Pattern:**
|
|
161
|
+
```
|
|
162
|
+
1. Run performance benchmark
|
|
163
|
+
2. Record baseline: 150ms average
|
|
164
|
+
3. Implement optimization
|
|
165
|
+
4. Run benchmark again
|
|
166
|
+
5. Record new measurement: 45ms average
|
|
167
|
+
6. Calculate improvement: 70% faster
|
|
168
|
+
7. Run multiple times to confirm consistency
|
|
169
|
+
8. Claim: "Performance improved 70% (150ms → 45ms, 10 runs)"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Incorrect Patterns:**
|
|
173
|
+
- ❌ "Should be faster now" (no measurement)
|
|
174
|
+
- ❌ "Looks quicker" (subjective)
|
|
175
|
+
- ❌ Single measurement (could be outlier)
|
|
176
|
+
|
|
177
|
+
## Security Verification
|
|
178
|
+
|
|
179
|
+
**Correct Pattern:**
|
|
180
|
+
```
|
|
181
|
+
1. Run security scanner: bandit -r .
|
|
182
|
+
2. Read full report
|
|
183
|
+
3. Review each finding
|
|
184
|
+
4. Document: "3 high, 2 medium, 5 low"
|
|
185
|
+
5. Address critical issues
|
|
186
|
+
6. Re-run scanner
|
|
187
|
+
7. Claim: "Security scan: 0 high, 0 medium, 5 low (accepted)"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Incorrect Patterns:**
|
|
191
|
+
- ❌ "Looks secure" (no scan)
|
|
192
|
+
- ❌ "No obvious vulnerabilities" (didn't scan)
|
|
193
|
+
- ❌ "Should be safe" (assumption)
|
|
194
|
+
|
|
195
|
+
## Documentation Verification
|
|
196
|
+
|
|
197
|
+
**Correct Pattern:**
|
|
198
|
+
```
|
|
199
|
+
1. Write documentation
|
|
200
|
+
2. Have someone else read it
|
|
201
|
+
3. Ask them to follow steps
|
|
202
|
+
4. Observe if they succeed without questions
|
|
203
|
+
5. Fix confusing parts
|
|
204
|
+
6. Repeat until successful
|
|
205
|
+
7. Claim: "Documentation verified with fresh user"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Incorrect Patterns:**
|
|
209
|
+
- ❌ "Documentation complete" (not tested)
|
|
210
|
+
- ❌ "Clear to me" (author bias)
|
|
211
|
+
- ❌ "Should be understandable" (no verification)
|
|
212
|
+
|
|
213
|
+
## The Universal Pattern
|
|
214
|
+
|
|
215
|
+
All verification follows this structure:
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
1. IDENTIFY: What proves this claim?
|
|
219
|
+
2. RUN: Execute the full verification command
|
|
220
|
+
3. READ: Complete output, not just summary
|
|
221
|
+
4. ANALYZE: Does evidence support claim?
|
|
222
|
+
5. DECIDE:
|
|
223
|
+
- If YES: Claim with evidence
|
|
224
|
+
- If NO: Report actual state with evidence
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Never skip steps. Never assume. Always verify.**
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
skill_id: docker-containerization
|
|
3
|
+
skill_version: 0.1.0
|
|
4
|
+
description: Essential Docker patterns for containerizing applications.
|
|
5
|
+
updated_at: 2025-10-30T17:00:00Z
|
|
6
|
+
tags: [docker, containers, deployment, devops]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Docker Containerization
|
|
10
|
+
|
|
11
|
+
Essential Docker patterns for containerizing applications.
|
|
12
|
+
|
|
13
|
+
## Basic Dockerfile Structure
|
|
14
|
+
|
|
15
|
+
```dockerfile
|
|
16
|
+
# Use official base image
|
|
17
|
+
FROM python:3.11-slim
|
|
18
|
+
|
|
19
|
+
# Set working directory
|
|
20
|
+
WORKDIR /app
|
|
21
|
+
|
|
22
|
+
# Copy dependency files first (better caching)
|
|
23
|
+
COPY requirements.txt .
|
|
24
|
+
|
|
25
|
+
# Install dependencies
|
|
26
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
27
|
+
|
|
28
|
+
# Copy application code
|
|
29
|
+
COPY . .
|
|
30
|
+
|
|
31
|
+
# Expose port
|
|
32
|
+
EXPOSE 8000
|
|
33
|
+
|
|
34
|
+
# Run application
|
|
35
|
+
CMD ["python", "app.py"]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Multi-Stage Builds
|
|
39
|
+
|
|
40
|
+
```dockerfile
|
|
41
|
+
# Build stage
|
|
42
|
+
FROM node:18 AS builder
|
|
43
|
+
WORKDIR /app
|
|
44
|
+
COPY package*.json ./
|
|
45
|
+
RUN npm ci
|
|
46
|
+
COPY . .
|
|
47
|
+
RUN npm run build
|
|
48
|
+
|
|
49
|
+
# Production stage
|
|
50
|
+
FROM node:18-slim
|
|
51
|
+
WORKDIR /app
|
|
52
|
+
COPY --from=builder /app/dist ./dist
|
|
53
|
+
COPY package*.json ./
|
|
54
|
+
RUN npm ci --only=production
|
|
55
|
+
EXPOSE 3000
|
|
56
|
+
CMD ["node", "dist/server.js"]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Docker Compose
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
version: '3.8'
|
|
63
|
+
|
|
64
|
+
services:
|
|
65
|
+
web:
|
|
66
|
+
build: .
|
|
67
|
+
ports:
|
|
68
|
+
- "8000:8000"
|
|
69
|
+
environment:
|
|
70
|
+
- DATABASE_URL=postgresql://db:5432/myapp
|
|
71
|
+
depends_on:
|
|
72
|
+
- db
|
|
73
|
+
volumes:
|
|
74
|
+
- ./src:/app/src # Hot reload in dev
|
|
75
|
+
|
|
76
|
+
db:
|
|
77
|
+
image: postgres:15
|
|
78
|
+
environment:
|
|
79
|
+
- POSTGRES_DB=myapp
|
|
80
|
+
- POSTGRES_PASSWORD=secret
|
|
81
|
+
volumes:
|
|
82
|
+
- postgres_data:/var/lib/postgresql/data
|
|
83
|
+
|
|
84
|
+
volumes:
|
|
85
|
+
postgres_data:
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Best Practices
|
|
89
|
+
|
|
90
|
+
### ✅ DO
|
|
91
|
+
```dockerfile
|
|
92
|
+
# Use specific versions
|
|
93
|
+
FROM python:3.11-slim
|
|
94
|
+
|
|
95
|
+
# Non-root user
|
|
96
|
+
RUN useradd -m appuser
|
|
97
|
+
USER appuser
|
|
98
|
+
|
|
99
|
+
# Layer caching
|
|
100
|
+
COPY requirements.txt .
|
|
101
|
+
RUN pip install -r requirements.txt
|
|
102
|
+
COPY . .
|
|
103
|
+
|
|
104
|
+
# Health check
|
|
105
|
+
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8000/health || exit 1
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### ❌ DON'T
|
|
109
|
+
```dockerfile
|
|
110
|
+
# Avoid latest tag
|
|
111
|
+
FROM python:latest
|
|
112
|
+
|
|
113
|
+
# Avoid running as root
|
|
114
|
+
USER root
|
|
115
|
+
|
|
116
|
+
# Don't copy unnecessary files
|
|
117
|
+
COPY . . # Includes .git, node_modules, etc.
|
|
118
|
+
|
|
119
|
+
# Use .dockerignore instead
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## .dockerignore
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
.git
|
|
126
|
+
.gitignore
|
|
127
|
+
node_modules
|
|
128
|
+
__pycache__
|
|
129
|
+
*.pyc
|
|
130
|
+
.env
|
|
131
|
+
.vscode
|
|
132
|
+
README.md
|
|
133
|
+
docker-compose.yml
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Common Commands
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Build image
|
|
140
|
+
docker build -t myapp:1.0 .
|
|
141
|
+
|
|
142
|
+
# Run container
|
|
143
|
+
docker run -p 8000:8000 myapp:1.0
|
|
144
|
+
|
|
145
|
+
# Run with environment variables
|
|
146
|
+
docker run -e DATABASE_URL=postgresql://... myapp:1.0
|
|
147
|
+
|
|
148
|
+
# Interactive shell
|
|
149
|
+
docker run -it myapp:1.0 /bin/bash
|
|
150
|
+
|
|
151
|
+
# View logs
|
|
152
|
+
docker logs container_id
|
|
153
|
+
|
|
154
|
+
# Stop container
|
|
155
|
+
docker stop container_id
|
|
156
|
+
|
|
157
|
+
# Remove container
|
|
158
|
+
docker rm container_id
|
|
159
|
+
|
|
160
|
+
# Remove image
|
|
161
|
+
docker rmi myapp:1.0
|
|
162
|
+
|
|
163
|
+
# Prune unused resources
|
|
164
|
+
docker system prune -a
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Docker Compose Commands
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Start services
|
|
171
|
+
docker-compose up
|
|
172
|
+
|
|
173
|
+
# Start in background
|
|
174
|
+
docker-compose up -d
|
|
175
|
+
|
|
176
|
+
# View logs
|
|
177
|
+
docker-compose logs -f
|
|
178
|
+
|
|
179
|
+
# Stop services
|
|
180
|
+
docker-compose down
|
|
181
|
+
|
|
182
|
+
# Rebuild
|
|
183
|
+
docker-compose build
|
|
184
|
+
|
|
185
|
+
# Run command in service
|
|
186
|
+
docker-compose exec web python manage.py migrate
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Remember
|
|
190
|
+
- Keep images small (use slim/alpine variants)
|
|
191
|
+
- Use specific version tags
|
|
192
|
+
- Leverage layer caching
|
|
193
|
+
- Don't include secrets in images
|
|
194
|
+
- Use .dockerignore to exclude files
|