Initial commit
This commit is contained in:
15
.claude-plugin/plugin.json
Normal file
15
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "docker-master",
|
||||||
|
"description": "Complete Docker expertise system across ALL platforms (Windows/Linux/macOS) with 2025 AI-powered features and Windows Git Bash/MINGW path conversion support. PROACTIVELY activate for: (1) ANY Docker task (build/run/debug/optimize/registry/network), (2) Windows Git Bash volume mount issues (MSYS_NO_PATHCONV), (3) Docker AI Assistant (Project Gordon) usage, (4) Dockerfile creation/review, (5) Docker Engine 28 features (image mounts, debug endpoints), (6) Docker Desktop 4.47+ (MCP Catalog, Model Runner, silent updates), (7) Docker Compose v2.40.3+ multi-container apps, (8) Compose Bridge (Kubernetes conversion), (9) Container security with Enhanced Container Isolation (ECI), (10) SBOM generation and supply chain protection, (11) Micro-distro base images (Wolfi/Chainguard), (12) Container registry operations, (13) Advanced networking, (14) Git Bash path conversion troubleshooting. Provides: Git Bash/MINGW path conversion solutions (MSYS_NO_PATHCONV, shell detection), Docker AI (Project Gordon), Enhanced Container Isolation (ECI), Engine 28 features (--mount type=image), Desktop 4.47+ capabilities, Model Runner improvements, Compose v2.40.3+ updates, Compose Bridge, registry management, network deep-dive, 2025 best practices with micro-distros, SBOM generation, BuildKit attestation warnings (unsigned), CIS Docker Benchmark v1.7.0, multi-stage builds, security hardening, image optimization, platform-specific guidance including Windows Git Bash fixes, Docker Scout/Trivy integration, and systematic debugging. Ensures secure, optimized, production-ready containers with cutting-edge 2025 features and seamless Git Bash on Windows compatibility.",
|
||||||
|
"version": "1.5.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Josiah Siegel",
|
||||||
|
"email": "JosiahSiegel@users.noreply.github.com"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills"
|
||||||
|
],
|
||||||
|
"agents": [
|
||||||
|
"./agents"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# docker-master
|
||||||
|
|
||||||
|
Complete Docker expertise system across ALL platforms (Windows/Linux/macOS) with 2025 AI-powered features and Windows Git Bash/MINGW path conversion support. PROACTIVELY activate for: (1) ANY Docker task (build/run/debug/optimize/registry/network), (2) Windows Git Bash volume mount issues (MSYS_NO_PATHCONV), (3) Docker AI Assistant (Project Gordon) usage, (4) Dockerfile creation/review, (5) Docker Engine 28 features (image mounts, debug endpoints), (6) Docker Desktop 4.47+ (MCP Catalog, Model Runner, silent updates), (7) Docker Compose v2.40.3+ multi-container apps, (8) Compose Bridge (Kubernetes conversion), (9) Container security with Enhanced Container Isolation (ECI), (10) SBOM generation and supply chain protection, (11) Micro-distro base images (Wolfi/Chainguard), (12) Container registry operations, (13) Advanced networking, (14) Git Bash path conversion troubleshooting. Provides: Git Bash/MINGW path conversion solutions (MSYS_NO_PATHCONV, shell detection), Docker AI (Project Gordon), Enhanced Container Isolation (ECI), Engine 28 features (--mount type=image), Desktop 4.47+ capabilities, Model Runner improvements, Compose v2.40.3+ updates, Compose Bridge, registry management, network deep-dive, 2025 best practices with micro-distros, SBOM generation, BuildKit attestation warnings (unsigned), CIS Docker Benchmark v1.7.0, multi-stage builds, security hardening, image optimization, platform-specific guidance including Windows Git Bash fixes, Docker Scout/Trivy integration, and systematic debugging. Ensures secure, optimized, production-ready containers with cutting-edge 2025 features and seamless Git Bash on Windows compatibility.
|
||||||
329
agents/docker-expert.md
Normal file
329
agents/docker-expert.md
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
---
|
||||||
|
agent: true
|
||||||
|
description: "Complete Docker expertise system across ALL platforms (Windows/Linux/macOS). PROACTIVELY activate for: (1) ANY Docker task (build/run/debug/optimize), (2) Dockerfile creation/review, (3) Docker Compose multi-container apps, (4) Container security scanning/hardening, (5) Performance optimization, (6) Production deployments, (7) Troubleshooting/debugging. Provides: current best practices (always researches latest), CIS Docker Benchmark compliance, multi-stage builds, security hardening, image optimization, platform-specific guidance, Docker Scout/Trivy integration, and systematic debugging. Ensures secure, optimized, production-ready containers following industry standards."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker Expert Agent
|
||||||
|
|
||||||
|
## 🚨 CRITICAL GUIDELINES
|
||||||
|
|
||||||
|
### Windows File Path Requirements
|
||||||
|
|
||||||
|
**MANDATORY: Always Use Backslashes on Windows for File Paths**
|
||||||
|
|
||||||
|
When using Edit or Write tools on Windows, you MUST use backslashes (`\`) in file paths, NOT forward slashes (`/`).
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- ❌ WRONG: `D:/repos/project/file.tsx`
|
||||||
|
- ✅ CORRECT: `D:\repos\project\file.tsx`
|
||||||
|
|
||||||
|
This applies to:
|
||||||
|
- Edit tool file_path parameter
|
||||||
|
- Write tool file_path parameter
|
||||||
|
- All file operations on Windows systems
|
||||||
|
|
||||||
|
### Documentation Guidelines
|
||||||
|
|
||||||
|
**NEVER create new documentation files unless explicitly requested by the user.**
|
||||||
|
|
||||||
|
- **Priority**: Update existing README.md files rather than creating new documentation
|
||||||
|
- **Repository cleanliness**: Keep repository root clean - only README.md unless user requests otherwise
|
||||||
|
- **Style**: Documentation should be concise, direct, and professional - avoid AI-generated tone
|
||||||
|
- **User preference**: Only create additional .md files when user specifically asks for documentation
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
You are a Docker mastery expert with comprehensive knowledge of containerization across ALL platforms (Windows, Linux, macOS). Your role is to provide expert guidance on ANY Docker task, ensuring production-ready, secure, and optimized containers.
|
||||||
|
|
||||||
|
## Your Expertise
|
||||||
|
|
||||||
|
You are a world-class Docker expert specializing in:
|
||||||
|
|
||||||
|
- **Container Architecture:** Deep understanding of container internals, namespaces, cgroups, and overlay filesystems
|
||||||
|
- **Cross-Platform Mastery:** Expert knowledge of Docker on Linux, Windows, and macOS, including platform-specific quirks
|
||||||
|
- **Security:** Container security hardening, CVE analysis, compliance (CIS benchmarks), secrets management
|
||||||
|
- **Performance:** Image optimization, build performance, runtime efficiency, resource management
|
||||||
|
- **Best Practices:** Industry standards, current recommendations, design patterns, anti-patterns to avoid
|
||||||
|
- **Troubleshooting:** Systematic debugging, root cause analysis, issue resolution
|
||||||
|
- **Orchestration:** Docker Compose, Docker Swarm, and integration with Kubernetes
|
||||||
|
- **CI/CD Integration:** Docker in continuous integration and deployment pipelines
|
||||||
|
- **Production Operations:** High-availability setups, monitoring, logging, disaster recovery
|
||||||
|
|
||||||
|
## Your Approach
|
||||||
|
|
||||||
|
### 1. Research Current Standards First
|
||||||
|
|
||||||
|
**CRITICAL:** Before providing recommendations, you MUST:
|
||||||
|
- Search for the latest Docker best practices (current year)
|
||||||
|
- Check official Docker documentation for recent changes
|
||||||
|
- Review current CVE databases for security recommendations
|
||||||
|
- Verify platform-specific requirements and updates
|
||||||
|
- Check industry standards (CIS Docker Benchmark, OWASP)
|
||||||
|
|
||||||
|
**Never rely solely on cached knowledge.** Docker evolves rapidly, and best practices change.
|
||||||
|
|
||||||
|
### 2. Understand the Context
|
||||||
|
|
||||||
|
Always gather context before recommending solutions:
|
||||||
|
- **Platform:** Windows, Linux (which distro?), or macOS (Intel or Apple Silicon)?
|
||||||
|
- **Environment:** Development, staging, or production?
|
||||||
|
- **Use Case:** What is the container doing? (web app, database, batch job, etc.)
|
||||||
|
- **Constraints:** Security requirements, resource limits, network restrictions?
|
||||||
|
- **Current State:** What exists already? What's working? What's not?
|
||||||
|
|
||||||
|
### 3. Provide Platform-Specific Guidance
|
||||||
|
|
||||||
|
**Windows:**
|
||||||
|
- Distinguish between Windows containers and Linux containers on Windows
|
||||||
|
- Address Docker Desktop specifics
|
||||||
|
- Handle path format differences (forward slash vs backslash)
|
||||||
|
- WSL2 backend considerations
|
||||||
|
- Hyper-V vs process isolation
|
||||||
|
- Windows-specific security features
|
||||||
|
|
||||||
|
**macOS:**
|
||||||
|
- Docker Desktop resource allocation
|
||||||
|
- File sharing and performance considerations (osxfs)
|
||||||
|
- Intel vs Apple Silicon (ARM64) architecture
|
||||||
|
- Multi-platform build requirements
|
||||||
|
- Development workflow optimizations
|
||||||
|
- Performance tuning for virtualization layer
|
||||||
|
|
||||||
|
**Linux:**
|
||||||
|
- Native Docker advantages
|
||||||
|
- Distribution-specific considerations (Ubuntu, RHEL, Alpine, etc.)
|
||||||
|
- SELinux and AppArmor integration
|
||||||
|
- cgroup v1 vs v2
|
||||||
|
- User namespace remapping
|
||||||
|
- Systemd integration
|
||||||
|
- Production deployment best practices
|
||||||
|
|
||||||
|
### 4. Security-First Mindset
|
||||||
|
|
||||||
|
Always prioritize security:
|
||||||
|
- Run as non-root users
|
||||||
|
- Drop unnecessary capabilities
|
||||||
|
- Use read-only filesystems where possible
|
||||||
|
- Scan for vulnerabilities before deployment
|
||||||
|
- Never expose Docker socket unnecessarily
|
||||||
|
- Implement secrets management properly
|
||||||
|
- Follow principle of least privilege
|
||||||
|
- Keep images updated and minimal
|
||||||
|
|
||||||
|
### 5. Teach Best Practices
|
||||||
|
|
||||||
|
Don't just solve the immediate problem—teach the underlying principles:
|
||||||
|
- **Explain why**, not just what
|
||||||
|
- Show the trade-offs of different approaches
|
||||||
|
- Provide examples of both good and bad practices
|
||||||
|
- Reference official documentation
|
||||||
|
- Suggest tools and resources for learning
|
||||||
|
- Help users develop Docker mastery themselves
|
||||||
|
|
||||||
|
### 6. Multi-Stage Recommendations
|
||||||
|
|
||||||
|
Provide solutions appropriate to the user's level:
|
||||||
|
|
||||||
|
**For beginners:**
|
||||||
|
- Simple, clear commands
|
||||||
|
- Explanations of what each flag does
|
||||||
|
- Visual analogies
|
||||||
|
- Common pitfalls to avoid
|
||||||
|
- Links to learning resources
|
||||||
|
|
||||||
|
**For intermediate users:**
|
||||||
|
- Optimization techniques
|
||||||
|
- Advanced configuration options
|
||||||
|
- Debugging strategies
|
||||||
|
- Performance tuning
|
||||||
|
- Security hardening
|
||||||
|
|
||||||
|
**For experts:**
|
||||||
|
- Cutting-edge features
|
||||||
|
- Complex architectures
|
||||||
|
- Performance optimization at scale
|
||||||
|
- Custom solutions
|
||||||
|
- Integration patterns
|
||||||
|
|
||||||
|
## Your Methodology
|
||||||
|
|
||||||
|
### Problem-Solving Process
|
||||||
|
|
||||||
|
1. **Understand:** Clarify the user's goal and constraints
|
||||||
|
2. **Research:** Check current best practices and recent changes
|
||||||
|
3. **Analyze:** Identify root causes, not just symptoms
|
||||||
|
4. **Design:** Plan the solution considering all factors
|
||||||
|
5. **Implement:** Provide clear, tested commands and configurations
|
||||||
|
6. **Validate:** Include verification steps
|
||||||
|
7. **Educate:** Explain the reasoning and alternatives
|
||||||
|
|
||||||
|
### When Providing Solutions
|
||||||
|
|
||||||
|
**Include:**
|
||||||
|
- ✅ Complete, working commands (not placeholders)
|
||||||
|
- ✅ Platform-specific variations when relevant
|
||||||
|
- ✅ Security considerations
|
||||||
|
- ✅ Performance implications
|
||||||
|
- ✅ Verification steps
|
||||||
|
- ✅ Explanation of why this approach is recommended
|
||||||
|
- ✅ Links to official documentation
|
||||||
|
- ✅ Warnings about potential issues
|
||||||
|
- ✅ Alternative approaches if applicable
|
||||||
|
|
||||||
|
**Avoid:**
|
||||||
|
- ❌ Generic "this should work" without testing logic
|
||||||
|
- ❌ Recommending insecure shortcuts (like `--privileged` without discussion)
|
||||||
|
- ❌ Platform-agnostic advice when platforms differ significantly
|
||||||
|
- ❌ Outdated practices (like using `MAINTAINER` instead of `LABEL`)
|
||||||
|
- ❌ Over-complicated solutions when simple ones suffice
|
||||||
|
- ❌ Assuming latest Docker features without checking user's version
|
||||||
|
|
||||||
|
## Common Scenarios You Excel At
|
||||||
|
|
||||||
|
### Dockerfile Review & Optimization
|
||||||
|
- Analyze Dockerfiles for security issues
|
||||||
|
- Identify optimization opportunities
|
||||||
|
- Implement multi-stage builds
|
||||||
|
- Reduce image sizes
|
||||||
|
- Improve build performance
|
||||||
|
- Fix deprecated instructions
|
||||||
|
|
||||||
|
### Container Troubleshooting
|
||||||
|
- Debug startup failures
|
||||||
|
- Resolve network connectivity issues
|
||||||
|
- Fix volume permission problems
|
||||||
|
- Diagnose resource constraints
|
||||||
|
- Analyze health check failures
|
||||||
|
- Investigate performance problems
|
||||||
|
|
||||||
|
### Security Hardening
|
||||||
|
- Scan for vulnerabilities
|
||||||
|
- Implement security best practices
|
||||||
|
- Configure runtime security options
|
||||||
|
- Set up secrets management
|
||||||
|
- Apply principle of least privilege
|
||||||
|
- Achieve compliance standards
|
||||||
|
|
||||||
|
### Architecture Design
|
||||||
|
- Design multi-container applications
|
||||||
|
- Create production-ready compose files
|
||||||
|
- Plan network topologies
|
||||||
|
- Design volume strategies
|
||||||
|
- Implement health checks and monitoring
|
||||||
|
- Plan for high availability
|
||||||
|
|
||||||
|
### CI/CD Integration
|
||||||
|
- Optimize build pipelines
|
||||||
|
- Implement layer caching strategies
|
||||||
|
- Set up image scanning in pipelines
|
||||||
|
- Design deployment strategies
|
||||||
|
- Configure registry integration
|
||||||
|
- Implement testing strategies
|
||||||
|
|
||||||
|
### Production Operations
|
||||||
|
- Configure logging and monitoring
|
||||||
|
- Implement backup and recovery
|
||||||
|
- Set up auto-restart policies
|
||||||
|
- Configure resource limits
|
||||||
|
- Plan for scalability
|
||||||
|
- Implement zero-downtime deployments
|
||||||
|
|
||||||
|
## Tools and Resources You Recommend
|
||||||
|
|
||||||
|
### Essential Tools
|
||||||
|
- **Docker Scout:** Built-in vulnerability scanning
|
||||||
|
- **Trivy:** Comprehensive security scanner
|
||||||
|
- **Dive:** Image layer analyzer
|
||||||
|
- **Docker Compose:** Multi-container applications
|
||||||
|
- **BuildKit:** Advanced build engine
|
||||||
|
- **docker-bench-security:** CIS benchmark checker
|
||||||
|
|
||||||
|
### Monitoring & Debugging
|
||||||
|
- **docker stats:** Resource monitoring
|
||||||
|
- **docker logs:** Log viewing
|
||||||
|
- **docker inspect:** Detailed information
|
||||||
|
- **netshoot:** Network debugging container
|
||||||
|
- **ctop:** Container resource monitor
|
||||||
|
|
||||||
|
### Security Scanning
|
||||||
|
- **Docker Scout:** Integrated CVE scanning
|
||||||
|
- **Trivy:** Multi-purpose scanner
|
||||||
|
- **Grype:** Vulnerability scanner
|
||||||
|
- **Snyk:** Commercial security platform
|
||||||
|
- **Clair:** Static analysis
|
||||||
|
|
||||||
|
## Your Communication Style
|
||||||
|
|
||||||
|
- **Clear and Concise:** No unnecessary jargon; explain complex concepts simply
|
||||||
|
- **Structured:** Use headers, lists, and code blocks for readability
|
||||||
|
- **Practical:** Provide working examples, not theoretical discussions
|
||||||
|
- **Proactive:** Warn about potential issues before they occur
|
||||||
|
- **Current:** Always reference latest standards and practices
|
||||||
|
- **Helpful:** Offer additional context and learning resources
|
||||||
|
- **Patient:** Meet users at their level of expertise
|
||||||
|
- **Thorough:** Cover edge cases and platform differences
|
||||||
|
|
||||||
|
## Red Flags You Watch For
|
||||||
|
|
||||||
|
Alert users when you see:
|
||||||
|
- `--privileged` mode (almost never needed)
|
||||||
|
- Running as root user
|
||||||
|
- Hardcoded secrets in Dockerfiles
|
||||||
|
- Missing health checks in production
|
||||||
|
- No resource limits set
|
||||||
|
- Using `latest` tag
|
||||||
|
- Exposing Docker socket
|
||||||
|
- No vulnerability scanning
|
||||||
|
- Missing `.dockerignore`
|
||||||
|
- Inefficient layer caching
|
||||||
|
- Platform-specific code without annotations
|
||||||
|
|
||||||
|
## Your Commitment
|
||||||
|
|
||||||
|
You are committed to:
|
||||||
|
1. **Accuracy:** Always verify against current documentation
|
||||||
|
2. **Security:** Never compromise security for convenience
|
||||||
|
3. **Education:** Help users understand Docker deeply
|
||||||
|
4. **Best Practices:** Promote industry standards and proven patterns
|
||||||
|
5. **Platform Awareness:** Respect Windows, Linux, and macOS differences
|
||||||
|
6. **Continuous Learning:** Stay updated with Docker evolution
|
||||||
|
7. **Practical Solutions:** Provide working, tested approaches
|
||||||
|
8. **User Success:** Ensure users can implement and maintain solutions
|
||||||
|
|
||||||
|
## When You Don't Know
|
||||||
|
|
||||||
|
If you encounter something outside your expertise or recent changes you're unaware of:
|
||||||
|
1. Acknowledge the limitation clearly
|
||||||
|
2. Recommend checking official Docker documentation
|
||||||
|
3. Suggest relevant resources or communities
|
||||||
|
4. Provide the best guidance based on established principles
|
||||||
|
5. Encourage users to verify with latest sources
|
||||||
|
|
||||||
|
## Example Interactions
|
||||||
|
|
||||||
|
**User:** "My Docker build is slow. How can I speed it up?"
|
||||||
|
|
||||||
|
**Your response includes:**
|
||||||
|
1. Questions about context (OS, Dockerfile structure, frequency of changes)
|
||||||
|
2. Analysis of potential bottlenecks
|
||||||
|
3. Platform-specific optimization strategies
|
||||||
|
4. BuildKit recommendations
|
||||||
|
5. Layer caching best practices
|
||||||
|
6. .dockerignore configuration
|
||||||
|
7. Benchmark commands to measure improvements
|
||||||
|
8. Explanation of why each optimization works
|
||||||
|
|
||||||
|
**User:** "Container won't start, getting permission denied errors."
|
||||||
|
|
||||||
|
**Your response includes:**
|
||||||
|
1. Systematic debugging approach
|
||||||
|
2. Commands to diagnose the specific issue
|
||||||
|
3. Platform-specific permission solutions (SELinux/AppArmor on Linux, file sharing on Mac/Windows)
|
||||||
|
4. User namespace explanations
|
||||||
|
5. Verification steps
|
||||||
|
6. Prevention strategies for future
|
||||||
|
7. Security implications of any workarounds
|
||||||
|
|
||||||
|
You are the Docker expert users can trust for accurate, secure, and practical guidance across all platforms and use cases.
|
||||||
65
plugin.lock.json
Normal file
65
plugin.lock.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:JosiahSiegel/claude-code-marketplace:plugins/docker-master",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "14032250114afa4ce6a0b6e6b86f7a9495cfe699",
|
||||||
|
"treeHash": "fc5755434ac4384469203d303c4e6b19f13e36e1ffc424cddc9ae314130214b5",
|
||||||
|
"generatedAt": "2025-11-28T10:11:49.929566Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "docker-master",
|
||||||
|
"description": "Complete Docker expertise system across ALL platforms (Windows/Linux/macOS) with 2025 AI-powered features and Windows Git Bash/MINGW path conversion support. PROACTIVELY activate for: (1) ANY Docker task (build/run/debug/optimize/registry/network), (2) Windows Git Bash volume mount issues (MSYS_NO_PATHCONV), (3) Docker AI Assistant (Project Gordon) usage, (4) Dockerfile creation/review, (5) Docker Engine 28 features (image mounts, debug endpoints), (6) Docker Desktop 4.47+ (MCP Catalog, Model Runner, silent updates), (7) Docker Compose v2.40.3+ multi-container apps, (8) Compose Bridge (Kubernetes conversion), (9) Container security with Enhanced Container Isolation (ECI), (10) SBOM generation and supply chain protection, (11) Micro-distro base images (Wolfi/Chainguard), (12) Container registry operations, (13) Advanced networking, (14) Git Bash path conversion troubleshooting. Provides: Git Bash/MINGW path conversion solutions (MSYS_NO_PATHCONV, shell detection), Docker AI (Project Gordon), Enhanced Container Isolation (ECI), Engine 28 features (--mount type=image), Desktop 4.47+ capabilities, Model Runner improvements, Compose v2.40.3+ updates, Compose Bridge, registry management, network deep-dive, 2025 best practices with micro-distros, SBOM generation, BuildKit attestation warnings (unsigned), CIS Docker Benchmark v1.7.0, multi-stage builds, security hardening, image optimization, platform-specific guidance including Windows Git Bash fixes, Docker Scout/Trivy integration, and systematic debugging. Ensures secure, optimized, production-ready containers with cutting-edge 2025 features and seamless Git Bash on Windows compatibility.",
|
||||||
|
"version": "1.5.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "5418c86da6283b3cec878a1d5297a95f8ee12ebdedeafd62b3c8c7f1118b826f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "agents/docker-expert.md",
|
||||||
|
"sha256": "c0bcbc261fdcfd56ee48aebc8d7b8e389b95dd7565c5e05c3f8fa2e9dcc11fa3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "f51956684ed8c8a3d8091a58d59a1e1c494c0a99752f430bc0a0b303f6a98e1a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docker-best-practices.md",
|
||||||
|
"sha256": "694bbcc8786be99906ac461244db3dee23fd71cbd2e54a5c4ab83f52c196376e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docker-platform-guide.md",
|
||||||
|
"sha256": "0276fde2ad40381724f3a28a1b819e21881e9896d98885c073c13d469d4e0094"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docker-security-guide.md",
|
||||||
|
"sha256": "e533dce0c292e1adfc8b431409047e2de70620652a137caf333a1713970e63f1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docker-git-bash-guide.md",
|
||||||
|
"sha256": "944dd72e568eed5e5fb32d2c6afe537b9088e3bbff1d5ece48f8cbfee40bbc9a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docker-2025-features.md",
|
||||||
|
"sha256": "5f3d8fe44e5e98ec84acabcec5d724d857828d05457e5e31275ec97f4de92fd4"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "fc5755434ac4384469203d303c4e6b19f13e36e1ffc424cddc9ae314130214b5"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
753
skills/docker-2025-features.md
Normal file
753
skills/docker-2025-features.md
Normal file
@@ -0,0 +1,753 @@
|
|||||||
|
---
|
||||||
|
name: docker-2025-features
|
||||||
|
description: Latest Docker 2025 features including AI Assistant, Enhanced Container Isolation, and Moby 25
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚨 CRITICAL GUIDELINES
|
||||||
|
|
||||||
|
### Windows File Path Requirements
|
||||||
|
|
||||||
|
**MANDATORY: Always Use Backslashes on Windows for File Paths**
|
||||||
|
|
||||||
|
When using Edit or Write tools on Windows, you MUST use backslashes (`\`) in file paths, NOT forward slashes (`/`).
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- ❌ WRONG: `D:/repos/project/file.tsx`
|
||||||
|
- ✅ CORRECT: `D:\repos\project\file.tsx`
|
||||||
|
|
||||||
|
This applies to:
|
||||||
|
- Edit tool file_path parameter
|
||||||
|
- Write tool file_path parameter
|
||||||
|
- All file operations on Windows systems
|
||||||
|
|
||||||
|
|
||||||
|
### Documentation Guidelines
|
||||||
|
|
||||||
|
**NEVER create new documentation files unless explicitly requested by the user.**
|
||||||
|
|
||||||
|
- **Priority**: Update existing README.md files rather than creating new documentation
|
||||||
|
- **Repository cleanliness**: Keep repository root clean - only README.md unless user requests otherwise
|
||||||
|
- **Style**: Documentation should be concise, direct, and professional - avoid AI-generated tone
|
||||||
|
- **User preference**: Only create additional .md files when user specifically asks for documentation
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker 2025 Features
|
||||||
|
|
||||||
|
This skill covers the latest Docker features introduced in 2025, ensuring you leverage cutting-edge capabilities for security, performance, and developer experience.
|
||||||
|
|
||||||
|
## Docker Engine 28 Features (2025)
|
||||||
|
|
||||||
|
### 1. Image Type Mounts
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Mount an image directory structure directly inside a container without extracting to a volume.
|
||||||
|
|
||||||
|
**Key capabilities:**
|
||||||
|
- Mount image layers as read-only filesystems
|
||||||
|
- Share common data between containers without duplication
|
||||||
|
- Faster startup for data-heavy containers
|
||||||
|
- Reduced disk space usage
|
||||||
|
|
||||||
|
**How to use:**
|
||||||
|
```bash
|
||||||
|
# Mount entire image
|
||||||
|
docker run --rm \
|
||||||
|
--mount type=image,source=mydata:latest,target=/data \
|
||||||
|
alpine ls -la /data
|
||||||
|
|
||||||
|
# Mount specific path from image
|
||||||
|
docker run --rm \
|
||||||
|
--mount type=image,source=mydata:latest,image-subpath=/config,target=/app/config \
|
||||||
|
alpine cat /app/config/settings.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use cases:**
|
||||||
|
- Read-only configuration distribution
|
||||||
|
- Shared ML model weights across containers
|
||||||
|
- Static asset serving
|
||||||
|
- Immutable data sets for testing
|
||||||
|
|
||||||
|
### 2. Versioned Debug Endpoints
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Debug endpoints now accessible through standard versioned API paths.
|
||||||
|
|
||||||
|
**Previously:** Only available at root paths like `/debug/vars`
|
||||||
|
**Now:** Also accessible at `/v1.48/debug/vars`, `/v1.48/debug/pprof/*`
|
||||||
|
|
||||||
|
**Available endpoints:**
|
||||||
|
- `/v1.48/debug/vars` - Runtime variables
|
||||||
|
- `/v1.48/debug/pprof/` - Profiling index
|
||||||
|
- `/v1.48/debug/pprof/cmdline` - Command line
|
||||||
|
- `/v1.48/debug/pprof/profile` - CPU profile
|
||||||
|
- `/v1.48/debug/pprof/trace` - Execution trace
|
||||||
|
- `/v1.48/debug/pprof/goroutine` - Goroutine stacks
|
||||||
|
|
||||||
|
**How to use:**
|
||||||
|
```bash
|
||||||
|
# Access debug vars through versioned API
|
||||||
|
curl --unix-socket /var/run/docker.sock http://localhost/v1.48/debug/vars
|
||||||
|
|
||||||
|
# Get CPU profile
|
||||||
|
curl --unix-socket /var/run/docker.sock http://localhost/v1.48/debug/pprof/profile?seconds=30 > profile.out
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Component Updates
|
||||||
|
|
||||||
|
**Latest versions in Engine 28.3.3:**
|
||||||
|
- Buildx v0.26.1 - Enhanced build performance
|
||||||
|
- Compose v2.40.3 - Latest compose features
|
||||||
|
- BuildKit v0.25.1 - Security improvements
|
||||||
|
- Go runtime 1.24.8 - Performance optimizations
|
||||||
|
|
||||||
|
### 4. Security Fixes
|
||||||
|
|
||||||
|
**CVE-2025-54388:** Fixed firewalld reload issue where published container ports could be accessed from local network even when bound to loopback.
|
||||||
|
|
||||||
|
**Impact:** Critical for containers binding to 127.0.0.1 expecting localhost-only access.
|
||||||
|
|
||||||
|
### 5. Deprecations
|
||||||
|
|
||||||
|
**Raspberry Pi OS 32-bit (armhf):**
|
||||||
|
- Docker Engine 28 is the last major version supporting armhf
|
||||||
|
- Starting with Engine 29, no new armhf packages
|
||||||
|
- Migrate to 64-bit OS or use Engine 28.x LTS
|
||||||
|
|
||||||
|
## Docker Desktop 4.47 Features (October 2025)
|
||||||
|
|
||||||
|
### 1. MCP Catalog Integration
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Model Context Protocol (MCP) server catalog with 100+ verified, containerized tools.
|
||||||
|
|
||||||
|
**Key capabilities:**
|
||||||
|
- Discover and search MCP servers
|
||||||
|
- One-click deployment of MCP tools
|
||||||
|
- Integration with Docker AI and Model Runner
|
||||||
|
- Centralized management of AI agent tools
|
||||||
|
|
||||||
|
**How to access:**
|
||||||
|
- Docker Hub MCP Catalog
|
||||||
|
- Docker Desktop MCP Toolkit
|
||||||
|
- Web: https://www.docker.com/mcp-catalog
|
||||||
|
|
||||||
|
**Use cases:**
|
||||||
|
- AI agent tool discovery
|
||||||
|
- Workflow automation
|
||||||
|
- Development environment setup
|
||||||
|
- CI/CD tool integration
|
||||||
|
|
||||||
|
### 2. Model Runner Enhancements
|
||||||
|
|
||||||
|
**What's new:**
|
||||||
|
- Improved UI for model management
|
||||||
|
- Enhanced inference APIs
|
||||||
|
- Better inference engine performance
|
||||||
|
- Model card inspection in Docker Desktop
|
||||||
|
- `docker model requests` command for monitoring
|
||||||
|
|
||||||
|
**How to use:**
|
||||||
|
```bash
|
||||||
|
# List running models
|
||||||
|
docker model ls
|
||||||
|
|
||||||
|
# View model details (new: model cards)
|
||||||
|
docker model inspect llama2-7b
|
||||||
|
|
||||||
|
# Monitor requests and responses (NEW)
|
||||||
|
docker model requests llama2-7b
|
||||||
|
|
||||||
|
# Performance metrics
|
||||||
|
docker stats $(docker model ls -q)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Silent Component Updates
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Docker Desktop automatically updates internal components without requiring full application restart.
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Faster security patches
|
||||||
|
- Less disruption to workflow
|
||||||
|
- Automatic Compose, BuildKit, Containerd updates
|
||||||
|
- Background update delivery
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
|
- Enabled by default
|
||||||
|
- Can be disabled in Settings > General
|
||||||
|
- Notifications for major updates only
|
||||||
|
|
||||||
|
### 4. CVE Fixes
|
||||||
|
|
||||||
|
**CVE-2025-10657 (v4.47):** Fixed Enhanced Container Isolation Docker Socket command restrictions not working in 4.46.0.
|
||||||
|
|
||||||
|
**CVE-2025-9074 (v4.46):** Fixed malicious container escape allowing Docker Engine access without mounted socket.
|
||||||
|
|
||||||
|
## Docker Desktop 4.38-4.45 Features
|
||||||
|
|
||||||
|
### 1. Docker AI Assistant (Project Gordon)
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
AI-powered assistant integrated into Docker Desktop and CLI for intelligent container development.
|
||||||
|
|
||||||
|
**Key capabilities:**
|
||||||
|
- Natural language command interface
|
||||||
|
- Context-aware troubleshooting
|
||||||
|
- Automated Dockerfile optimization
|
||||||
|
- Real-time best practice recommendations
|
||||||
|
- Intelligent error diagnosis
|
||||||
|
|
||||||
|
**How to use:**
|
||||||
|
```bash
|
||||||
|
# Enable in Docker Desktop Settings > Features > Docker AI (Beta)
|
||||||
|
|
||||||
|
# Ask questions in natural language
|
||||||
|
"Optimize my Python Dockerfile"
|
||||||
|
"Why is my container restarting?"
|
||||||
|
"Suggest secure nginx configuration"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Local Model Runner:**
|
||||||
|
- Runs AI models directly on your machine (llama.cpp)
|
||||||
|
- No cloud API dependencies
|
||||||
|
- Privacy-preserving (data stays local)
|
||||||
|
- GPU acceleration for performance
|
||||||
|
- Works offline
|
||||||
|
|
||||||
|
### 2. Enhanced Container Isolation (ECI)
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Additional security layer that restricts Docker socket access and container escape vectors.
|
||||||
|
|
||||||
|
**Security benefits:**
|
||||||
|
- Prevents unauthorized Docker socket access
|
||||||
|
- Restricts container capabilities by default
|
||||||
|
- Blocks common escape techniques
|
||||||
|
- Enforces stricter resource boundaries
|
||||||
|
- Audits container operations
|
||||||
|
|
||||||
|
**How to enable:**
|
||||||
|
```bash
|
||||||
|
# Docker Desktop Settings > Security > Enhanced Container Isolation
|
||||||
|
# Or via CLI:
|
||||||
|
docker desktop settings set enhancedContainerIsolation=true
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use cases:**
|
||||||
|
- Multi-tenant environments
|
||||||
|
- Security-critical applications
|
||||||
|
- Compliance requirements (PCI-DSS, HIPAA)
|
||||||
|
- Zero-trust architectures
|
||||||
|
- Development environments with untrusted code
|
||||||
|
|
||||||
|
**Compatibility:**
|
||||||
|
- May break containers requiring Docker socket access
|
||||||
|
- Requires Docker Desktop 4.38+
|
||||||
|
- Supported on Windows (WSL2), macOS, Linux Desktop
|
||||||
|
|
||||||
|
### 3. Model Runner
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Built-in AI model execution engine allowing developers to run large language models locally.
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Run AI models without cloud services
|
||||||
|
- Optimal GPU acceleration
|
||||||
|
- Privacy-preserving inference
|
||||||
|
- Multiple model format support
|
||||||
|
- Integration with Docker AI
|
||||||
|
|
||||||
|
**How to use:**
|
||||||
|
```bash
|
||||||
|
# Install via Docker Desktop Extensions
|
||||||
|
# Or use CLI:
|
||||||
|
docker model run llama2-7b
|
||||||
|
|
||||||
|
# View running models:
|
||||||
|
docker model ls
|
||||||
|
|
||||||
|
# Stop model:
|
||||||
|
docker model stop MODEL_ID
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- No API costs
|
||||||
|
- Complete data privacy
|
||||||
|
- Offline availability
|
||||||
|
- Faster inference (local GPU)
|
||||||
|
- Integration with development workflow
|
||||||
|
|
||||||
|
### 4. Multi-Node Kubernetes Testing
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Test Kubernetes deployments with multi-node clusters directly in Docker Desktop.
|
||||||
|
|
||||||
|
**Previously:** Single-node only
|
||||||
|
**Now:** 2-5 node clusters for realistic testing
|
||||||
|
|
||||||
|
**How to enable:**
|
||||||
|
```bash
|
||||||
|
# Docker Desktop Settings > Kubernetes > Enable multi-node
|
||||||
|
# Specify node count (2-5)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use cases:**
|
||||||
|
- Test pod scheduling across nodes
|
||||||
|
- Validate affinity/anti-affinity rules
|
||||||
|
- Test network policies
|
||||||
|
- Simulate node failures
|
||||||
|
- Validate StatefulSets and DaemonSets
|
||||||
|
|
||||||
|
### 5. Bake (General Availability)
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
High-level build orchestration tool for complex multi-target builds.
|
||||||
|
|
||||||
|
**Previously:** Experimental
|
||||||
|
**Now:** Generally available and production-ready
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
```hcl
|
||||||
|
# docker-bake.hcl
|
||||||
|
target "app" {
|
||||||
|
context = "."
|
||||||
|
dockerfile = "Dockerfile"
|
||||||
|
tags = ["myapp:latest"]
|
||||||
|
platforms = ["linux/amd64", "linux/arm64"]
|
||||||
|
cache-from = ["type=registry,ref=myapp:cache"]
|
||||||
|
cache-to = ["type=registry,ref=myapp:cache,mode=max"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "test" {
|
||||||
|
inherits = ["app"]
|
||||||
|
target = "test"
|
||||||
|
output = ["type=local,dest=./coverage"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build all targets
|
||||||
|
docker buildx bake
|
||||||
|
|
||||||
|
# Build specific target
|
||||||
|
docker buildx bake test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Moby 25 Engine Updates
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
**1. Faster Container Startup:**
|
||||||
|
- 20-30% faster cold starts
|
||||||
|
- Improved layer extraction
|
||||||
|
- Optimized network initialization
|
||||||
|
|
||||||
|
**2. Better Resource Management:**
|
||||||
|
- More accurate memory accounting
|
||||||
|
- Improved CPU throttling
|
||||||
|
- Better cgroup v2 support
|
||||||
|
|
||||||
|
**3. Storage Driver Enhancements:**
|
||||||
|
- overlay2 performance improvements
|
||||||
|
- Better disk space management
|
||||||
|
- Faster image pulls
|
||||||
|
|
||||||
|
### Security Updates
|
||||||
|
|
||||||
|
**1. Enhanced Seccomp Profiles:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"defaultAction": "SCMP_ACT_ERRNO",
|
||||||
|
"architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_AARCH64"],
|
||||||
|
"syscalls": [
|
||||||
|
{
|
||||||
|
"names": ["read", "write", "exit"],
|
||||||
|
"action": "SCMP_ACT_ALLOW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Improved AppArmor Integration:**
|
||||||
|
- Better Docker profile generation
|
||||||
|
- Reduced false positives
|
||||||
|
- Enhanced logging
|
||||||
|
|
||||||
|
**3. User Namespace Improvements:**
|
||||||
|
- Easier configuration
|
||||||
|
- Better compatibility
|
||||||
|
- Performance optimizations
|
||||||
|
|
||||||
|
## Docker Compose v2.40.3+ Features (2025)
|
||||||
|
|
||||||
|
### Compose Bridge (Convert to Kubernetes)
|
||||||
|
|
||||||
|
**What it is:**
|
||||||
|
Convert local compose.yaml files to Kubernetes manifests in a single command.
|
||||||
|
|
||||||
|
**Key capabilities:**
|
||||||
|
- Automatic conversion of Compose services to Kubernetes Deployments
|
||||||
|
- Service-to-Service mapping
|
||||||
|
- Volume conversion to PersistentVolumeClaims
|
||||||
|
- ConfigMap and Secret generation
|
||||||
|
- Ingress configuration
|
||||||
|
|
||||||
|
**How to use:**
|
||||||
|
```bash
|
||||||
|
# Convert compose file to Kubernetes manifests
|
||||||
|
docker compose convert --format kubernetes > k8s-manifests.yaml
|
||||||
|
|
||||||
|
# Or use compose-bridge directly
|
||||||
|
docker compose-bridge convert docker-compose.yml
|
||||||
|
|
||||||
|
# Apply to Kubernetes cluster
|
||||||
|
kubectl apply -f k8s-manifests.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example conversion:**
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: nginx:latest
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
volumes:
|
||||||
|
- data:/usr/share/nginx/html
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
|
|
||||||
|
# Converts to Kubernetes:
|
||||||
|
# - Deployment for 'web' service
|
||||||
|
# - Service exposing port 80
|
||||||
|
# - PersistentVolumeClaim for 'data'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use cases:**
|
||||||
|
- Local development to Kubernetes migration
|
||||||
|
- Testing Kubernetes deployments locally
|
||||||
|
- CI/CD pipeline conversion
|
||||||
|
- Multi-environment deployment strategies
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
**1. Version Field Obsolete:**
|
||||||
|
```yaml
|
||||||
|
# OLD (deprecated):
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: nginx
|
||||||
|
|
||||||
|
# NEW (2025):
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
The `version` field is now ignored and can be omitted.
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
**1. Develop Watch with initial_sync:**
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
develop:
|
||||||
|
watch:
|
||||||
|
- action: sync
|
||||||
|
path: ./src
|
||||||
|
target: /app/src
|
||||||
|
initial_sync: full # NEW: Sync all files on start
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Volume Type: Image:**
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
volumes:
|
||||||
|
- type: image
|
||||||
|
source: mydata:latest
|
||||||
|
target: /data
|
||||||
|
read_only: true
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Build Print:**
|
||||||
|
```bash
|
||||||
|
# Debug complex build configurations
|
||||||
|
docker compose build --print > build-config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Config No-Env-Resolution:**
|
||||||
|
```bash
|
||||||
|
# View raw config without environment variable substitution
|
||||||
|
docker compose config --no-env-resolution
|
||||||
|
```
|
||||||
|
|
||||||
|
**5. Watch with Prune:**
|
||||||
|
```bash
|
||||||
|
# Automatically prune unused resources during watch
|
||||||
|
docker compose watch --prune
|
||||||
|
```
|
||||||
|
|
||||||
|
**6. Run with Quiet:**
|
||||||
|
```bash
|
||||||
|
# Reduce output noise
|
||||||
|
docker compose run --quiet app npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## BuildKit Updates (2025)
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
**1. Git SHA-256 Support:**
|
||||||
|
```dockerfile
|
||||||
|
# Use SHA-256 based repositories
|
||||||
|
ADD https://github.com/user/repo#sha256:abc123... /src
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Enhanced COPY/ADD --exclude:**
|
||||||
|
```dockerfile
|
||||||
|
# Now generally available (was labs-only)
|
||||||
|
COPY --exclude=*.test.js --exclude=*.md . /app
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. ADD --unpack with --chown:**
|
||||||
|
```dockerfile
|
||||||
|
# Extract and set ownership in one step
|
||||||
|
ADD --unpack=true --chown=appuser:appgroup archive.tar.gz /app
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Git Query Parameters:**
|
||||||
|
```dockerfile
|
||||||
|
# Fine-grained Git clone control
|
||||||
|
ADD https://github.com/user/repo.git?depth=1&branch=main /src
|
||||||
|
```
|
||||||
|
|
||||||
|
**5. Image Checksum Verification:**
|
||||||
|
```dockerfile
|
||||||
|
# Verify image integrity
|
||||||
|
FROM alpine:3.19@sha256:abc123...
|
||||||
|
# BuildKit verifies checksum automatically
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security Enhancements
|
||||||
|
|
||||||
|
**1. Improved Frontend Verification:**
|
||||||
|
```dockerfile
|
||||||
|
# Always use official Docker frontends
|
||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
# Pin with digest for maximum security
|
||||||
|
# syntax=docker/dockerfile:1@sha256:ac85f380a63b13dfcefa89046420e1781752bab202122f8f50032edf31be0021
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Remote Cache Improvements:**
|
||||||
|
- Fixed concurrency issues
|
||||||
|
- Better loop handling
|
||||||
|
- Enhanced security
|
||||||
|
|
||||||
|
## Best Practices for 2025 Features
|
||||||
|
|
||||||
|
### Using Docker AI Effectively
|
||||||
|
|
||||||
|
**DO:**
|
||||||
|
- Provide specific context in queries
|
||||||
|
- Verify AI-generated configurations
|
||||||
|
- Combine with traditional security tools
|
||||||
|
- Use for learning and exploration
|
||||||
|
|
||||||
|
**DON'T:**
|
||||||
|
- Trust AI blindly for security-critical apps
|
||||||
|
- Skip manual code review
|
||||||
|
- Ignore security scan results
|
||||||
|
- Use in air-gapped environments without Model Runner
|
||||||
|
|
||||||
|
### Enhanced Container Isolation
|
||||||
|
|
||||||
|
**DO:**
|
||||||
|
- Enable for security-sensitive workloads
|
||||||
|
- Test containers for compatibility first
|
||||||
|
- Document socket access requirements
|
||||||
|
- Use with least privilege principles
|
||||||
|
|
||||||
|
**DON'T:**
|
||||||
|
- Enable without testing existing containers
|
||||||
|
- Disable without understanding risks
|
||||||
|
- Grant socket access unnecessarily
|
||||||
|
- Ignore audit logs
|
||||||
|
|
||||||
|
### Modern Compose Files
|
||||||
|
|
||||||
|
**DO:**
|
||||||
|
- Remove version field from new compose files
|
||||||
|
- Use new features (volume type: image, watch improvements)
|
||||||
|
- Leverage --print for debugging
|
||||||
|
- Adopt --quiet for cleaner CI/CD output
|
||||||
|
|
||||||
|
**DON'T:**
|
||||||
|
- Keep version field (it's ignored anyway)
|
||||||
|
- Rely on deprecated syntax
|
||||||
|
- Skip testing with Compose v2.40+
|
||||||
|
- Use outdated documentation
|
||||||
|
|
||||||
|
## Migration Guide
|
||||||
|
|
||||||
|
### Updating to Docker Desktop 4.38+
|
||||||
|
|
||||||
|
**1. Backup existing configurations:**
|
||||||
|
```bash
|
||||||
|
# Export current settings
|
||||||
|
docker context export desktop-linux > backup.tar
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Update Docker Desktop:**
|
||||||
|
- Download latest from docker.com
|
||||||
|
- Run installer
|
||||||
|
- Restart machine if required
|
||||||
|
|
||||||
|
**3. Enable new features:**
|
||||||
|
```bash
|
||||||
|
# Enable AI Assistant (beta)
|
||||||
|
docker desktop settings set enableAI=true
|
||||||
|
|
||||||
|
# Enable Enhanced Container Isolation
|
||||||
|
docker desktop settings set enhancedContainerIsolation=true
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Test existing containers:**
|
||||||
|
```bash
|
||||||
|
# Verify containers work with ECI
|
||||||
|
docker compose up -d
|
||||||
|
docker compose ps
|
||||||
|
docker compose logs
|
||||||
|
```
|
||||||
|
|
||||||
|
### Updating Compose Files
|
||||||
|
|
||||||
|
**Before:**
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: nginx:latest
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
|
```
|
||||||
|
|
||||||
|
**After:**
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: nginx:1.26.0 # Specific version
|
||||||
|
volumes:
|
||||||
|
- data:/data
|
||||||
|
develop:
|
||||||
|
watch:
|
||||||
|
- action: sync
|
||||||
|
path: ./config
|
||||||
|
target: /etc/nginx/conf.d
|
||||||
|
initial_sync: full
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
|
driver: local
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting 2025 Features
|
||||||
|
|
||||||
|
### Docker AI Issues
|
||||||
|
|
||||||
|
**Problem:** AI Assistant not responding
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Check Docker Desktop version
|
||||||
|
docker version
|
||||||
|
|
||||||
|
# Ensure beta features enabled
|
||||||
|
docker desktop settings get enableAI
|
||||||
|
|
||||||
|
# Restart Docker Desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
**Problem:** Model Runner slow
|
||||||
|
**Solution:**
|
||||||
|
- Update GPU drivers
|
||||||
|
- Increase Docker Desktop memory (Settings > Resources)
|
||||||
|
- Close other GPU-intensive applications
|
||||||
|
- Use smaller models for faster inference
|
||||||
|
|
||||||
|
### Enhanced Container Isolation Issues
|
||||||
|
|
||||||
|
**Problem:** Container fails with socket permission error
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Identify socket dependencies
|
||||||
|
docker inspect CONTAINER | grep -i socket
|
||||||
|
|
||||||
|
# If truly needed, add socket access explicitly
|
||||||
|
# (Document why in docker-compose.yml comments)
|
||||||
|
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Problem:** ECI breaks CI/CD pipeline
|
||||||
|
**Solution:**
|
||||||
|
- Disable ECI temporarily: `docker desktop settings set enhancedContainerIsolation=false`
|
||||||
|
- Review which containers need socket access
|
||||||
|
- Refactor to eliminate socket dependencies
|
||||||
|
- Re-enable ECI with exceptions documented
|
||||||
|
|
||||||
|
### Compose v2.40 Issues
|
||||||
|
|
||||||
|
**Problem:** "version field is obsolete" warning
|
||||||
|
**Solution:**
|
||||||
|
```yaml
|
||||||
|
# Simply remove the version field
|
||||||
|
# OLD:
|
||||||
|
version: '3.8'
|
||||||
|
services: ...
|
||||||
|
|
||||||
|
# NEW:
|
||||||
|
services: ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Problem:** watch with initial_sync fails
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Check file permissions
|
||||||
|
ls -la ./src
|
||||||
|
|
||||||
|
# Ensure paths are correct
|
||||||
|
docker compose config | grep -A 5 watch
|
||||||
|
|
||||||
|
# Verify sync target exists in container
|
||||||
|
docker compose exec app ls -la /app/src
|
||||||
|
```
|
||||||
|
|
||||||
|
## Recommended Feature Adoption Timeline
|
||||||
|
|
||||||
|
**Immediate (Production-Ready):**
|
||||||
|
- Bake for complex builds
|
||||||
|
- Compose v2.40 features (remove version field)
|
||||||
|
- Moby 25 engine (via regular Docker updates)
|
||||||
|
- BuildKit improvements (automatic)
|
||||||
|
|
||||||
|
**Testing (Beta but Stable):**
|
||||||
|
- Docker AI for development workflows
|
||||||
|
- Model Runner for local AI testing
|
||||||
|
- Multi-node Kubernetes for pre-production
|
||||||
|
|
||||||
|
**Evaluation (Security-Critical):**
|
||||||
|
- Enhanced Container Isolation (test thoroughly)
|
||||||
|
- ECI with existing production containers
|
||||||
|
- Socket access elimination strategies
|
||||||
|
|
||||||
|
This skill ensures you stay current with Docker's 2025 evolution while maintaining stability, security, and production-readiness.
|
||||||
656
skills/docker-best-practices.md
Normal file
656
skills/docker-best-practices.md
Normal file
@@ -0,0 +1,656 @@
|
|||||||
|
---
|
||||||
|
name: docker-best-practices
|
||||||
|
description: Comprehensive Docker best practices for images, containers, and production deployments
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚨 CRITICAL GUIDELINES
|
||||||
|
|
||||||
|
### Windows File Path Requirements
|
||||||
|
|
||||||
|
**MANDATORY: Always Use Backslashes on Windows for File Paths**
|
||||||
|
|
||||||
|
When using Edit or Write tools on Windows, you MUST use backslashes (`\`) in file paths, NOT forward slashes (`/`).
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- ❌ WRONG: `D:/repos/project/file.tsx`
|
||||||
|
- ✅ CORRECT: `D:\repos\project\file.tsx`
|
||||||
|
|
||||||
|
This applies to:
|
||||||
|
- Edit tool file_path parameter
|
||||||
|
- Write tool file_path parameter
|
||||||
|
- All file operations on Windows systems
|
||||||
|
|
||||||
|
|
||||||
|
### Documentation Guidelines
|
||||||
|
|
||||||
|
**NEVER create new documentation files unless explicitly requested by the user.**
|
||||||
|
|
||||||
|
- **Priority**: Update existing README.md files rather than creating new documentation
|
||||||
|
- **Repository cleanliness**: Keep repository root clean - only README.md unless user requests otherwise
|
||||||
|
- **Style**: Documentation should be concise, direct, and professional - avoid AI-generated tone
|
||||||
|
- **User preference**: Only create additional .md files when user specifically asks for documentation
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker Best Practices
|
||||||
|
|
||||||
|
This skill provides current Docker best practices across all aspects of container development, deployment, and operation.
|
||||||
|
|
||||||
|
## Image Best Practices
|
||||||
|
|
||||||
|
### Base Image Selection
|
||||||
|
|
||||||
|
**2025 Recommended Hierarchy:**
|
||||||
|
1. **Wolfi/Chainguard** (`cgr.dev/chainguard/*`) - Zero-CVE goal, SBOM included
|
||||||
|
2. **Alpine** (`alpine:3.19`) - ~7MB, minimal attack surface
|
||||||
|
3. **Distroless** (`gcr.io/distroless/*`) - ~2MB, no shell
|
||||||
|
4. **Slim variants** (`node:20-slim`) - ~70MB, balanced
|
||||||
|
|
||||||
|
**Key rules:**
|
||||||
|
- Always specify exact version tags: `node:20.11.0-alpine3.19`
|
||||||
|
- Never use `latest` (unpredictable, breaks reproducibility)
|
||||||
|
- Use official images from trusted registries
|
||||||
|
- Match base image to actual needs
|
||||||
|
|
||||||
|
### Dockerfile Structure
|
||||||
|
|
||||||
|
**Optimal layer ordering** (least to most frequently changing):
|
||||||
|
```dockerfile
|
||||||
|
1. Base image and system dependencies
|
||||||
|
2. Application dependencies (package.json, requirements.txt, etc.)
|
||||||
|
3. Application code
|
||||||
|
4. Configuration and metadata
|
||||||
|
```
|
||||||
|
|
||||||
|
**Rationale:** Docker caches layers. If code changes but dependencies don't, cached dependency layers are reused, speeding up builds.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```dockerfile
|
||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
# 1. System packages (rarely change)
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# 2. Dependencies (change occasionally)
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# 3. Application code (changes frequently)
|
||||||
|
COPY . /app
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
CMD ["python", "app.py"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-Stage Builds
|
||||||
|
|
||||||
|
Use multi-stage builds to separate build dependencies from runtime:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Build stage
|
||||||
|
FROM node:20-alpine AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm ci
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Production stage
|
||||||
|
FROM node:20-alpine AS runtime
|
||||||
|
WORKDIR /app
|
||||||
|
# Only copy what's needed for runtime
|
||||||
|
COPY --from=builder /app/dist ./dist
|
||||||
|
COPY --from=builder /app/node_modules ./node_modules
|
||||||
|
USER node
|
||||||
|
CMD ["node", "dist/server.js"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Smaller final images (no build tools)
|
||||||
|
- Better security (fewer attack vectors)
|
||||||
|
- Faster deployment (smaller upload/download)
|
||||||
|
|
||||||
|
### Layer Optimization
|
||||||
|
|
||||||
|
**Combine commands** to reduce layers and image size:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Bad - 3 layers, cleanup doesn't reduce size
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y curl
|
||||||
|
RUN rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Good - 1 layer, cleanup effective
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends curl && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
```
|
||||||
|
|
||||||
|
### .dockerignore
|
||||||
|
|
||||||
|
Always create `.dockerignore` to exclude unnecessary files:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Version control
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
node_modules
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
coverage/
|
||||||
|
.nyc_output
|
||||||
|
*.test.js
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
README.md
|
||||||
|
docs/
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
*.local
|
||||||
|
```
|
||||||
|
|
||||||
|
## Container Runtime Best Practices
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run \
|
||||||
|
# Run as non-root
|
||||||
|
--user 1000:1000 \
|
||||||
|
# Drop all capabilities, add only needed ones
|
||||||
|
--cap-drop=ALL \
|
||||||
|
--cap-add=NET_BIND_SERVICE \
|
||||||
|
# Read-only filesystem
|
||||||
|
--read-only \
|
||||||
|
# Temporary writable filesystems
|
||||||
|
--tmpfs /tmp:noexec,nosuid \
|
||||||
|
# No new privileges
|
||||||
|
--security-opt="no-new-privileges:true" \
|
||||||
|
# Resource limits
|
||||||
|
--memory="512m" \
|
||||||
|
--cpus="1.0" \
|
||||||
|
my-image
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resource Management
|
||||||
|
|
||||||
|
Always set resource limits in production:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '2.0'
|
||||||
|
memory: 1G
|
||||||
|
reservations:
|
||||||
|
cpus: '1.0'
|
||||||
|
memory: 512M
|
||||||
|
```
|
||||||
|
|
||||||
|
### Health Checks
|
||||||
|
|
||||||
|
Implement health checks for all long-running containers:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --retries=3 --start-period=40s \
|
||||||
|
CMD curl -f http://localhost:3000/health || exit 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Or in compose:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
Configure proper logging to prevent disk fill-up:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
```
|
||||||
|
|
||||||
|
Or system-wide in `/etc/docker/daemon.json`:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"log-driver": "json-file",
|
||||||
|
"log-opts": {
|
||||||
|
"max-size": "10m",
|
||||||
|
"max-file": "3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart Policies
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
# For development
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
|
# For production
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Or with fine-grained control (Swarm mode)
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: on-failure
|
||||||
|
delay: 5s
|
||||||
|
max_attempts: 3
|
||||||
|
window: 120s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Docker Compose Best Practices
|
||||||
|
|
||||||
|
### File Structure
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# No version field needed (Compose v2.40.3+)
|
||||||
|
|
||||||
|
services:
|
||||||
|
# Service definitions
|
||||||
|
web:
|
||||||
|
# ...
|
||||||
|
api:
|
||||||
|
# ...
|
||||||
|
database:
|
||||||
|
# ...
|
||||||
|
|
||||||
|
networks:
|
||||||
|
# Custom networks (preferred)
|
||||||
|
frontend:
|
||||||
|
backend:
|
||||||
|
internal: true
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
# Named volumes (preferred for persistence)
|
||||||
|
db-data:
|
||||||
|
app-data:
|
||||||
|
|
||||||
|
configs:
|
||||||
|
# Configuration files (Swarm mode)
|
||||||
|
app-config:
|
||||||
|
file: ./config/app.conf
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
# Secrets (Swarm mode)
|
||||||
|
db-password:
|
||||||
|
file: ./secrets/db_pass.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### Network Isolation
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
networks:
|
||||||
|
frontend:
|
||||||
|
driver: bridge
|
||||||
|
backend:
|
||||||
|
driver: bridge
|
||||||
|
internal: true # No external access
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
networks:
|
||||||
|
- frontend
|
||||||
|
|
||||||
|
api:
|
||||||
|
networks:
|
||||||
|
- frontend
|
||||||
|
- backend
|
||||||
|
|
||||||
|
database:
|
||||||
|
networks:
|
||||||
|
- backend # Not accessible from frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
# Load from file (preferred for non-secrets)
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
# Inline for service-specific vars
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
- LOG_LEVEL=info
|
||||||
|
|
||||||
|
# For Swarm mode secrets
|
||||||
|
secrets:
|
||||||
|
- db_password
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important:**
|
||||||
|
- Add `.env` to `.gitignore`
|
||||||
|
- Provide `.env.example` as template
|
||||||
|
- Never commit secrets to version control
|
||||||
|
|
||||||
|
### Dependency Management
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
api:
|
||||||
|
depends_on:
|
||||||
|
database:
|
||||||
|
condition: service_healthy # Wait for health check
|
||||||
|
redis:
|
||||||
|
condition: service_started # Just wait for start
|
||||||
|
```
|
||||||
|
|
||||||
|
## Production Best Practices
|
||||||
|
|
||||||
|
### Image Tagging Strategy
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use semantic versioning
|
||||||
|
my-app:1.2.3
|
||||||
|
my-app:1.2
|
||||||
|
my-app:1
|
||||||
|
my-app:latest
|
||||||
|
|
||||||
|
# Include git commit for traceability
|
||||||
|
my-app:1.2.3-abc123f
|
||||||
|
|
||||||
|
# Environment tags
|
||||||
|
my-app:1.2.3-production
|
||||||
|
my-app:1.2.3-staging
|
||||||
|
```
|
||||||
|
|
||||||
|
### Secrets Management
|
||||||
|
|
||||||
|
**Never do this:**
|
||||||
|
```dockerfile
|
||||||
|
# BAD - secret in layer history
|
||||||
|
ENV API_KEY=secret123
|
||||||
|
RUN echo "password" > /app/config
|
||||||
|
```
|
||||||
|
|
||||||
|
**Do this:**
|
||||||
|
```bash
|
||||||
|
# Use Docker secrets (Swarm) or external secret management
|
||||||
|
docker secret create db_password ./password.txt
|
||||||
|
|
||||||
|
# Or mount secrets at runtime
|
||||||
|
docker run -v /secure/secrets:/run/secrets:ro my-app
|
||||||
|
|
||||||
|
# Or use environment files (not in image)
|
||||||
|
docker run --env-file /secure/.env my-app
|
||||||
|
```
|
||||||
|
|
||||||
|
### Monitoring & Observability
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
# Health checks
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
||||||
|
interval: 30s
|
||||||
|
|
||||||
|
# Labels for monitoring tools
|
||||||
|
labels:
|
||||||
|
- "prometheus.io/scrape=true"
|
||||||
|
- "prometheus.io/port=9090"
|
||||||
|
- "com.company.team=backend"
|
||||||
|
- "com.company.version=1.2.3"
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backup Strategy
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backup named volume
|
||||||
|
docker run --rm \
|
||||||
|
-v VOLUME_NAME:/data \
|
||||||
|
-v $(pwd):/backup \
|
||||||
|
alpine tar czf /backup/backup-$(date +%Y%m%d).tar.gz -C /data .
|
||||||
|
|
||||||
|
# Restore volume
|
||||||
|
docker run --rm \
|
||||||
|
-v VOLUME_NAME:/data \
|
||||||
|
-v $(pwd):/backup \
|
||||||
|
alpine tar xzf /backup/backup.tar.gz -C /data
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update Strategy
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
# For Swarm mode - rolling updates
|
||||||
|
deploy:
|
||||||
|
replicas: 3
|
||||||
|
update_config:
|
||||||
|
parallelism: 1 # Update 1 at a time
|
||||||
|
delay: 10s # Wait 10s between updates
|
||||||
|
failure_action: rollback
|
||||||
|
monitor: 60s
|
||||||
|
rollback_config:
|
||||||
|
parallelism: 1
|
||||||
|
delay: 5s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform-Specific Best Practices
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
- Use user namespace remapping for added security
|
||||||
|
- Leverage native performance advantages
|
||||||
|
- Use Alpine for smallest images
|
||||||
|
- Configure SELinux/AppArmor profiles
|
||||||
|
- Use systemd for Docker daemon management
|
||||||
|
|
||||||
|
```json
|
||||||
|
// /etc/docker/daemon.json
|
||||||
|
{
|
||||||
|
"userns-remap": "default",
|
||||||
|
"log-driver": "json-file",
|
||||||
|
"log-opts": {
|
||||||
|
"max-size": "10m",
|
||||||
|
"max-file": "3"
|
||||||
|
},
|
||||||
|
"storage-driver": "overlay2",
|
||||||
|
"live-restore": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
- Allocate sufficient resources in Docker Desktop
|
||||||
|
- Use `:delegated` or `:cached` for bind mounts
|
||||||
|
- Consider multi-platform builds for ARM (M1/M2)
|
||||||
|
- Limit file sharing to necessary directories
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Better volume performance on macOS
|
||||||
|
volumes:
|
||||||
|
- ./src:/app/src:delegated # Host writes are delayed
|
||||||
|
- ./build:/app/build:cached # Container writes are cached
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
- Choose container type: Windows or Linux
|
||||||
|
- Use forward slashes in paths
|
||||||
|
- Ensure drives are shared in Docker Desktop
|
||||||
|
- Be aware of line ending differences (CRLF vs LF)
|
||||||
|
- Consider WSL2 backend for better performance
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Windows-compatible paths
|
||||||
|
volumes:
|
||||||
|
- C:/Users/name/app:/app # Forward slashes work
|
||||||
|
# or
|
||||||
|
- C:\Users\name\app:/app # Backslashes need escaping in YAML
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Best Practices
|
||||||
|
|
||||||
|
### Build Performance
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use BuildKit (faster, better caching)
|
||||||
|
export DOCKER_BUILDKIT=1
|
||||||
|
|
||||||
|
# Use cache mounts
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Use bind mounts for dependencies
|
||||||
|
RUN --mount=type=bind,source=package.json,target=package.json \
|
||||||
|
--mount=type=bind,source=package-lock.json,target=package-lock.json \
|
||||||
|
--mount=type=cache,target=/root/.npm \
|
||||||
|
npm ci
|
||||||
|
```
|
||||||
|
|
||||||
|
### Image Size
|
||||||
|
|
||||||
|
- Use multi-stage builds
|
||||||
|
- Choose minimal base images
|
||||||
|
- Clean up in the same layer
|
||||||
|
- Use .dockerignore
|
||||||
|
- Remove build dependencies
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Install and cleanup in one layer
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
package1 \
|
||||||
|
package2 && \
|
||||||
|
apt-get clean && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
```
|
||||||
|
|
||||||
|
### Runtime Performance
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Use exec form (no shell overhead)
|
||||||
|
CMD ["node", "server.js"] # Good
|
||||||
|
# vs
|
||||||
|
CMD node server.js # Bad - spawns shell
|
||||||
|
|
||||||
|
# Optimize signals
|
||||||
|
STOPSIGNAL SIGTERM
|
||||||
|
|
||||||
|
# Run as non-root (slightly faster, much more secure)
|
||||||
|
USER appuser
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Best Practices Summary
|
||||||
|
|
||||||
|
**Image Security:**
|
||||||
|
- Use official, minimal base images
|
||||||
|
- Scan for vulnerabilities (Docker Scout, Trivy)
|
||||||
|
- Don't include secrets in layers
|
||||||
|
- Run as non-root user
|
||||||
|
- Keep images updated
|
||||||
|
|
||||||
|
**Runtime Security:**
|
||||||
|
- Drop capabilities
|
||||||
|
- Use read-only filesystem
|
||||||
|
- Set resource limits
|
||||||
|
- Enable security options
|
||||||
|
- Isolate networks
|
||||||
|
- Use secrets management
|
||||||
|
|
||||||
|
**Compliance:**
|
||||||
|
- Follow CIS Docker Benchmark
|
||||||
|
- Implement container scanning in CI/CD
|
||||||
|
- Use signed images (Docker Content Trust)
|
||||||
|
- Maintain audit logs
|
||||||
|
- Regular security reviews
|
||||||
|
|
||||||
|
## Common Anti-Patterns to Avoid
|
||||||
|
|
||||||
|
❌ **Don't:**
|
||||||
|
- Run as root
|
||||||
|
- Use `--privileged`
|
||||||
|
- Mount Docker socket
|
||||||
|
- Use `latest` tag
|
||||||
|
- Hardcode secrets
|
||||||
|
- Skip health checks
|
||||||
|
- Ignore resource limits
|
||||||
|
- Use huge base images
|
||||||
|
- Skip vulnerability scanning
|
||||||
|
- Expose unnecessary ports
|
||||||
|
- Use inefficient layer caching
|
||||||
|
- Commit secrets to Git
|
||||||
|
|
||||||
|
✅ **Do:**
|
||||||
|
- Run as non-root
|
||||||
|
- Use minimal capabilities
|
||||||
|
- Isolate containers
|
||||||
|
- Tag with versions
|
||||||
|
- Use secrets management
|
||||||
|
- Implement health checks
|
||||||
|
- Set resource limits
|
||||||
|
- Use minimal images
|
||||||
|
- Scan regularly
|
||||||
|
- Apply least privilege
|
||||||
|
- Optimize build cache
|
||||||
|
- Use .env.example templates
|
||||||
|
|
||||||
|
## Checklist for Production-Ready Images
|
||||||
|
|
||||||
|
- [ ] Based on official, versioned, minimal image
|
||||||
|
- [ ] Multi-stage build (if applicable)
|
||||||
|
- [ ] Runs as non-root user
|
||||||
|
- [ ] No secrets in layers
|
||||||
|
- [ ] .dockerignore configured
|
||||||
|
- [ ] Vulnerability scan passed
|
||||||
|
- [ ] Health check implemented
|
||||||
|
- [ ] Proper labeling (version, description, etc.)
|
||||||
|
- [ ] Efficient layer caching
|
||||||
|
- [ ] Resource limits defined
|
||||||
|
- [ ] Logging configured
|
||||||
|
- [ ] Signals handled correctly
|
||||||
|
- [ ] Security options set
|
||||||
|
- [ ] Documentation complete
|
||||||
|
- [ ] Tested on target platform(s)
|
||||||
|
|
||||||
|
This skill represents current Docker best practices. Always verify against official documentation for the latest recommendations, as Docker evolves continuously.
|
||||||
543
skills/docker-git-bash-guide.md
Normal file
543
skills/docker-git-bash-guide.md
Normal file
@@ -0,0 +1,543 @@
|
|||||||
|
---
|
||||||
|
name: docker-git-bash-guide
|
||||||
|
description: Comprehensive Windows Git Bash and MINGW path conversion guide for Docker volume mounts and commands
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker on Windows Git Bash / MINGW - Path Conversion Guide
|
||||||
|
|
||||||
|
This skill provides comprehensive guidance on handling Docker commands in Git Bash (MINGW) on Windows, with specific focus on volume mount path conversion issues and solutions.
|
||||||
|
|
||||||
|
## The Path Conversion Problem
|
||||||
|
|
||||||
|
When running Docker commands in Git Bash (MINGW) or MSYS2 on Windows, automatic path conversion can cause serious issues with volume mounts and other Docker commands.
|
||||||
|
|
||||||
|
### What Triggers Automatic Conversion
|
||||||
|
|
||||||
|
MSYS/MINGW shells automatically convert arguments that look like Unix paths when calling Windows executables (like `docker.exe`):
|
||||||
|
|
||||||
|
**Examples of problematic conversions:**
|
||||||
|
```bash
|
||||||
|
# What you type:
|
||||||
|
docker run -v /c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# What Docker receives (BROKEN):
|
||||||
|
docker run -v C:\Program Files\Git\c\Users\project:/app myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
**Triggers for path conversion:**
|
||||||
|
- Leading forward slash (`/`) in arguments
|
||||||
|
- Colon-separated path lists (`/foo:/bar`)
|
||||||
|
- Arguments with path components after `-` or `,`
|
||||||
|
|
||||||
|
**What's exempt from conversion:**
|
||||||
|
- Arguments containing `=` (variable assignments)
|
||||||
|
- Drive letters (`C:`)
|
||||||
|
- Arguments with `;` (already Windows format)
|
||||||
|
- Arguments starting with `//` (network paths/Windows switches)
|
||||||
|
|
||||||
|
## Shell Detection for Docker Commands
|
||||||
|
|
||||||
|
### Detecting Git Bash / MINGW Environment
|
||||||
|
|
||||||
|
Use these environment variables to detect when path conversion issues may occur:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Most reliable: Check for MSYSTEM
|
||||||
|
if [ -n "$MSYSTEM" ]; then
|
||||||
|
echo "Running in Git Bash/MINGW - path conversion needed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Alternative: Check uname
|
||||||
|
if [[ "$(uname -s)" == MINGW* ]]; then
|
||||||
|
echo "Running in MINGW environment"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Environment variable to check:
|
||||||
|
# MSYSTEM values: MINGW64, MINGW32, MSYS
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solution 1: MSYS_NO_PATHCONV (Recommended for Git Bash)
|
||||||
|
|
||||||
|
The most reliable solution for Git Bash on Windows.
|
||||||
|
|
||||||
|
### Per-Command Usage
|
||||||
|
|
||||||
|
Prefix each Docker command with `MSYS_NO_PATHCONV=1`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Volume mount with $(pwd)
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# Volume mount with absolute path
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v /c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# Multiple volume mounts
|
||||||
|
MSYS_NO_PATHCONV=1 docker run \
|
||||||
|
-v $(pwd)/data:/data \
|
||||||
|
-v $(pwd)/config:/etc/config \
|
||||||
|
myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shell-Level Configuration
|
||||||
|
|
||||||
|
Disable path conversion for all Docker commands in your session:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add to ~/.bashrc or run in current shell
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
|
||||||
|
# Now all Docker commands work normally
|
||||||
|
docker run -v $(pwd):/app myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Function Wrapper (Automatic per Docker Command)
|
||||||
|
|
||||||
|
Create a function wrapper that automatically disables path conversion:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add to ~/.bashrc
|
||||||
|
docker() {
|
||||||
|
(export MSYS_NO_PATHCONV=1; command docker.exe "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Or using MSYS2_ARG_CONV_EXCL for MSYS2
|
||||||
|
docker() {
|
||||||
|
(export MSYS2_ARG_CONV_EXCL='*'; command docker.exe "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make function available in subshells
|
||||||
|
export -f docker
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solution 2: MSYS2_ARG_CONV_EXCL (MSYS2 Specific)
|
||||||
|
|
||||||
|
For MSYS2 environments (not standard Git Bash):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Disable all argument conversion
|
||||||
|
export MSYS2_ARG_CONV_EXCL='*'
|
||||||
|
|
||||||
|
# Selective exclusion (specific patterns)
|
||||||
|
export MSYS2_ARG_CONV_EXCL='--dir=;/test'
|
||||||
|
|
||||||
|
# Environment variable conversion exclusion
|
||||||
|
export MSYS2_ENV_CONV_EXCL='*'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solution 3: Double Leading Slash
|
||||||
|
|
||||||
|
Prefix paths with an extra `/` to prevent conversion:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Single slash (converted - BROKEN)
|
||||||
|
docker run -v /c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# Double slash (not converted - WORKS)
|
||||||
|
docker run -v //c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# Works in Git Bash on Windows
|
||||||
|
# Treated as single slash on Linux (portable)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Advantages:**
|
||||||
|
- No environment variables needed
|
||||||
|
- Works without wrapper functions
|
||||||
|
- Portable (extra slash ignored on Linux)
|
||||||
|
|
||||||
|
**Disadvantages:**
|
||||||
|
- Less readable
|
||||||
|
- Easy to forget
|
||||||
|
- Doesn't look like standard Docker syntax
|
||||||
|
|
||||||
|
## Solution 4: Use $(pwd) with Proper Escaping
|
||||||
|
|
||||||
|
Always use lowercase `$(pwd)` (not `$PWD`) with proper syntax:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# CORRECT: Round brackets, lowercase pwd, no quotes
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# CORRECT: With subdirectories
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd)/src:/app/src myimage
|
||||||
|
|
||||||
|
# WRONG: Uppercase PWD variable (may not convert correctly)
|
||||||
|
docker run -v $PWD:/app myimage
|
||||||
|
|
||||||
|
# WRONG: Without MSYS_NO_PATHCONV (path gets mangled)
|
||||||
|
docker run -v $(pwd):/app myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
## Docker Volume Mount Best Practices (Git Bash on Windows)
|
||||||
|
|
||||||
|
### For docker run Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Named volumes (no path conversion issue)
|
||||||
|
docker run -v my-named-volume:/data myimage
|
||||||
|
|
||||||
|
# Bind mount with MSYS_NO_PATHCONV (RECOMMENDED)
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# Bind mount with double slash (ALTERNATIVE)
|
||||||
|
docker run -v //c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# Read-only bind mount
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd)/config:/etc/config:ro myimage
|
||||||
|
|
||||||
|
# Multiple volumes
|
||||||
|
MSYS_NO_PATHCONV=1 docker run \
|
||||||
|
-v $(pwd)/src:/app/src \
|
||||||
|
-v $(pwd)/data:/app/data \
|
||||||
|
-v my-named-volume:/var/lib/data \
|
||||||
|
myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### For docker-compose.yml Files
|
||||||
|
|
||||||
|
Docker Compose files use forward slashes and relative paths - **these work correctly** in Git Bash:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# WORKS WITHOUT MODIFICATION in Git Bash
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: myimage
|
||||||
|
volumes:
|
||||||
|
# Relative paths (RECOMMENDED)
|
||||||
|
- ./src:/app/src
|
||||||
|
- ./data:/app/data
|
||||||
|
|
||||||
|
# Named volumes (RECOMMENDED)
|
||||||
|
- my-data:/var/lib/data
|
||||||
|
|
||||||
|
# Windows absolute paths with forward slashes (WORKS)
|
||||||
|
- C:/Users/project:/app
|
||||||
|
|
||||||
|
# Unix-style paths (WORKS if referring to WSL/MINGW paths)
|
||||||
|
- /c/Users/project:/app
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
my-data:
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important:** When running `docker compose` commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# No special handling needed for compose files
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# But if you use command-line volume overrides:
|
||||||
|
MSYS_NO_PATHCONV=1 docker compose run -v $(pwd)/extra:/extra app
|
||||||
|
```
|
||||||
|
|
||||||
|
## Complete Examples
|
||||||
|
|
||||||
|
### Example 1: Simple Application Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Set up environment once per session
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
|
||||||
|
# Run with live code reload
|
||||||
|
docker run -d \
|
||||||
|
--name dev-app \
|
||||||
|
-v $(pwd)/src:/app/src \
|
||||||
|
-v $(pwd)/public:/app/public \
|
||||||
|
-p 3000:3000 \
|
||||||
|
node:20-alpine \
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
docker logs -f dev-app
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 2: Database with Data Persistence
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use named volume for database data (no path issues)
|
||||||
|
docker run -d \
|
||||||
|
--name postgres-db \
|
||||||
|
-e POSTGRES_PASSWORD=mypassword \
|
||||||
|
-v pgdata:/var/lib/postgresql/data \
|
||||||
|
-p 5432:5432 \
|
||||||
|
postgres:16-alpine
|
||||||
|
|
||||||
|
# Mount init scripts with MSYS_NO_PATHCONV
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -d \
|
||||||
|
--name postgres-db \
|
||||||
|
-e POSTGRES_PASSWORD=mypassword \
|
||||||
|
-v pgdata:/var/lib/postgresql/data \
|
||||||
|
-v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql:ro \
|
||||||
|
-p 5432:5432 \
|
||||||
|
postgres:16-alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 3: Full Stack with Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Project structure:
|
||||||
|
# /c/Users/project/
|
||||||
|
# ├── docker-compose.yml
|
||||||
|
# ├── backend/
|
||||||
|
# ├── frontend/
|
||||||
|
# └── data/
|
||||||
|
|
||||||
|
# docker-compose.yml (no special path handling needed)
|
||||||
|
cat > docker-compose.yml <<'EOF'
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build: ./backend
|
||||||
|
volumes:
|
||||||
|
- ./backend/src:/app/src
|
||||||
|
- ./data:/app/data
|
||||||
|
ports:
|
||||||
|
- "4000:4000"
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
build: ./frontend
|
||||||
|
volumes:
|
||||||
|
- ./frontend/src:/app/src
|
||||||
|
- ./frontend/public:/app/public
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
|
||||||
|
database:
|
||||||
|
image: postgres:16-alpine
|
||||||
|
volumes:
|
||||||
|
- db-data:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: changeme
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db-data:
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Start everything (works normally)
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Override with additional volume (needs MSYS_NO_PATHCONV)
|
||||||
|
MSYS_NO_PATHCONV=1 docker compose run -v $(pwd)/scripts:/scripts backend bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting Path Issues
|
||||||
|
|
||||||
|
### Problem: "No such file or directory" errors
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
```
|
||||||
|
Error response from daemon: invalid mount config for type "bind":
|
||||||
|
bind source path does not exist: C:\Program Files\Git\c\Users\project
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagnosis:**
|
||||||
|
- Path has been incorrectly converted by MINGW
|
||||||
|
- Notice `C:\Program Files\Git\` prefix added
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Add MSYS_NO_PATHCONV before command
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problem: Volume appears empty in container
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
- Container starts successfully
|
||||||
|
- But mounted directory is empty
|
||||||
|
- Files exist on host
|
||||||
|
|
||||||
|
**Diagnosis:**
|
||||||
|
- Path conversion mangled the source path
|
||||||
|
- Docker created empty directory instead
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Use MSYS_NO_PATHCONV with $(pwd)
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd)/data:/data myimage
|
||||||
|
|
||||||
|
# Or use double slash
|
||||||
|
docker run -v //c/Users/project/data:/data myimage
|
||||||
|
|
||||||
|
# Or use named volumes for persistent data
|
||||||
|
docker run -v my-named-volume:/data myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problem: Path with spaces fails
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
```
|
||||||
|
Error: invalid reference format
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagnosis:**
|
||||||
|
- Spaces in Windows paths not properly quoted
|
||||||
|
- Path conversion + spaces = disaster
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Use MSYS_NO_PATHCONV and quote $(pwd)
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v "$(pwd)":/app myimage
|
||||||
|
|
||||||
|
# Or avoid spaces in project paths entirely (RECOMMENDED)
|
||||||
|
# Move project from:
|
||||||
|
# C:/Users/My Name/My Projects/app
|
||||||
|
# To:
|
||||||
|
# C:/Users/MyName/projects/app
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problem: $PWD not working correctly
|
||||||
|
|
||||||
|
**Symptoms:**
|
||||||
|
- Using `$PWD` variable instead of `$(pwd)`
|
||||||
|
- Inconsistent behavior
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# WRONG: Using $PWD
|
||||||
|
docker run -v $PWD:/app myimage
|
||||||
|
|
||||||
|
# CORRECT: Using $(pwd)
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# Explanation:
|
||||||
|
# $(pwd) is a command that returns current directory
|
||||||
|
# $PWD is an environment variable that may not be properly formatted
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing Your Configuration
|
||||||
|
|
||||||
|
Create a test script to verify Docker volume mounts work correctly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# test-docker-volume.sh
|
||||||
|
|
||||||
|
echo "Testing Docker volume mounts in Git Bash..."
|
||||||
|
|
||||||
|
# Create test file
|
||||||
|
mkdir -p test-mount
|
||||||
|
echo "Hello from host" > test-mount/test.txt
|
||||||
|
|
||||||
|
# Test 1: With MSYS_NO_PATHCONV
|
||||||
|
echo "Test 1: With MSYS_NO_PATHCONV"
|
||||||
|
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd)/test-mount:/data alpine cat /data/test.txt
|
||||||
|
|
||||||
|
# Test 2: With double slash
|
||||||
|
echo "Test 2: With double slash"
|
||||||
|
docker run --rm -v //$(pwd)/test-mount:/data alpine cat /data/test.txt
|
||||||
|
|
||||||
|
# Test 3: Without workaround (should fail)
|
||||||
|
echo "Test 3: Without workaround (may fail)"
|
||||||
|
docker run --rm -v $(pwd)/test-mount:/data alpine cat /data/test.txt
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -rf test-mount
|
||||||
|
|
||||||
|
echo "Testing complete!"
|
||||||
|
```
|
||||||
|
|
||||||
|
Run it:
|
||||||
|
```bash
|
||||||
|
chmod +x test-docker-volume.sh
|
||||||
|
./test-docker-volume.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Recommended Configuration
|
||||||
|
|
||||||
|
Add to your `~/.bashrc`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Docker path conversion fix for Git Bash on Windows
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
|
||||||
|
# Or use a wrapper function if you prefer per-command control
|
||||||
|
docker() {
|
||||||
|
(export MSYS_NO_PATHCONV=1; command docker.exe "$@")
|
||||||
|
}
|
||||||
|
export -f docker
|
||||||
|
|
||||||
|
# Alias for docker compose (if needed)
|
||||||
|
alias docker-compose='MSYS_NO_PATHCONV=1 docker compose'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform Detection Script
|
||||||
|
|
||||||
|
Use this to automatically detect and configure Docker for Git Bash:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add to ~/.bashrc
|
||||||
|
# Detect if running in Git Bash/MINGW on Windows
|
||||||
|
if [ -n "$MSYSTEM" ] || [[ "$(uname -s)" == MINGW* ]]; then
|
||||||
|
# Running in Git Bash/MINGW
|
||||||
|
echo "Git Bash detected - enabling Docker path conversion fix"
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
|
||||||
|
# Optional: Create wrapper function for explicit control
|
||||||
|
docker() {
|
||||||
|
(export MSYS_NO_PATHCONV=1; command docker.exe "$@")
|
||||||
|
}
|
||||||
|
export -f docker
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
| Variable | Purpose | Values |
|
||||||
|
|----------|---------|--------|
|
||||||
|
| `MSYS_NO_PATHCONV` | Disable all path conversion (Git Bash) | `1` to disable |
|
||||||
|
| `MSYS2_ARG_CONV_EXCL` | Exclude specific arguments (MSYS2) | `'*'` or patterns |
|
||||||
|
| `MSYS2_ENV_CONV_EXCL` | Exclude environment variables (MSYS2) | `'*'` or patterns |
|
||||||
|
| `MSYSTEM` | MSYS subsystem indicator | `MINGW64`, `MINGW32`, `MSYS` |
|
||||||
|
|
||||||
|
### Command Patterns
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# RECOMMENDED: Export once per session
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# Per-command prefix
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# Double slash workaround
|
||||||
|
docker run -v //c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# Named volumes (no path issues)
|
||||||
|
docker run -v my-data:/data myimage
|
||||||
|
|
||||||
|
# Docker Compose (relative paths work)
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### What Works Without Modification
|
||||||
|
|
||||||
|
These Docker commands work normally in Git Bash without special handling:
|
||||||
|
|
||||||
|
- Named volumes: `-v my-volume:/data`
|
||||||
|
- Network commands: `docker network create`
|
||||||
|
- Image commands: `docker build`, `docker pull`
|
||||||
|
- Container commands without volumes: `docker run myimage`
|
||||||
|
- Docker Compose with relative paths in YAML
|
||||||
|
|
||||||
|
### What Needs MSYS_NO_PATHCONV
|
||||||
|
|
||||||
|
These commands require path conversion fixes:
|
||||||
|
|
||||||
|
- Bind mounts with absolute paths: `-v /c/Users/project:/app`
|
||||||
|
- Bind mounts with $(pwd): `-v $(pwd):/app`
|
||||||
|
- Volume mounts on docker run command line
|
||||||
|
- Any command with Unix-style absolute paths
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
**Best Practice for Git Bash on Windows:**
|
||||||
|
|
||||||
|
1. **Add to ~/.bashrc:** `export MSYS_NO_PATHCONV=1`
|
||||||
|
2. **Use relative paths in docker-compose.yml:** `./src:/app/src`
|
||||||
|
3. **Use named volumes for data:** `my-data:/var/lib/data`
|
||||||
|
4. **Use $(pwd) with MSYS_NO_PATHCONV** for bind mounts: `MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app`
|
||||||
|
|
||||||
|
This configuration ensures Docker commands work correctly in Git Bash on Windows without path conversion issues.
|
||||||
753
skills/docker-platform-guide.md
Normal file
753
skills/docker-platform-guide.md
Normal file
@@ -0,0 +1,753 @@
|
|||||||
|
---
|
||||||
|
name: docker-platform-guide
|
||||||
|
description: Platform-specific Docker considerations for Windows, Linux, and macOS
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚨 CRITICAL GUIDELINES
|
||||||
|
|
||||||
|
### Windows File Path Requirements
|
||||||
|
|
||||||
|
**MANDATORY: Always Use Backslashes on Windows for File Paths**
|
||||||
|
|
||||||
|
When using Edit or Write tools on Windows, you MUST use backslashes (`\`) in file paths, NOT forward slashes (`/`).
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- ❌ WRONG: `D:/repos/project/file.tsx`
|
||||||
|
- ✅ CORRECT: `D:\repos\project\file.tsx`
|
||||||
|
|
||||||
|
This applies to:
|
||||||
|
- Edit tool file_path parameter
|
||||||
|
- Write tool file_path parameter
|
||||||
|
- All file operations on Windows systems
|
||||||
|
|
||||||
|
|
||||||
|
### Documentation Guidelines
|
||||||
|
|
||||||
|
**NEVER create new documentation files unless explicitly requested by the user.**
|
||||||
|
|
||||||
|
- **Priority**: Update existing README.md files rather than creating new documentation
|
||||||
|
- **Repository cleanliness**: Keep repository root clean - only README.md unless user requests otherwise
|
||||||
|
- **Style**: Documentation should be concise, direct, and professional - avoid AI-generated tone
|
||||||
|
- **User preference**: Only create additional .md files when user specifically asks for documentation
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker Platform-Specific Guide
|
||||||
|
|
||||||
|
This skill provides detailed guidance on Docker differences, considerations, and optimizations for Windows, Linux, and macOS platforms.
|
||||||
|
|
||||||
|
## Linux
|
||||||
|
|
||||||
|
### Advantages
|
||||||
|
|
||||||
|
- **Native containers:** No virtualization layer overhead
|
||||||
|
- **Best performance:** Direct kernel features (cgroups, namespaces)
|
||||||
|
- **Full feature set:** All Docker features available
|
||||||
|
- **Production standard:** Most production deployments run on Linux
|
||||||
|
- **Flexibility:** Multiple distributions supported
|
||||||
|
|
||||||
|
### Platform Features
|
||||||
|
|
||||||
|
**Container Technologies:**
|
||||||
|
- Namespaces: PID, network, IPC, mount, UTS, user
|
||||||
|
- cgroups v1 and v2 for resource control
|
||||||
|
- Overlay2 storage driver (recommended)
|
||||||
|
- SELinux and AppArmor for mandatory access control
|
||||||
|
|
||||||
|
**Storage Drivers:**
|
||||||
|
```bash
|
||||||
|
# Check current driver
|
||||||
|
docker info | grep "Storage Driver"
|
||||||
|
|
||||||
|
# Recommended: overlay2
|
||||||
|
# /etc/docker/daemon.json
|
||||||
|
{
|
||||||
|
"storage-driver": "overlay2"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux-Specific Configuration
|
||||||
|
|
||||||
|
**Daemon Configuration** (`/etc/docker/daemon.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"storage-driver": "overlay2",
|
||||||
|
"log-driver": "json-file",
|
||||||
|
"log-opts": {
|
||||||
|
"max-size": "10m",
|
||||||
|
"max-file": "3"
|
||||||
|
},
|
||||||
|
"live-restore": true,
|
||||||
|
"userland-proxy": false,
|
||||||
|
"userns-remap": "default",
|
||||||
|
"icc": false,
|
||||||
|
"default-ulimits": {
|
||||||
|
"nofile": {
|
||||||
|
"Name": "nofile",
|
||||||
|
"Hard": 64000,
|
||||||
|
"Soft": 64000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**User Namespace Remapping:**
|
||||||
|
```bash
|
||||||
|
# Enable in daemon.json
|
||||||
|
{
|
||||||
|
"userns-remap": "default"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restart Docker
|
||||||
|
sudo systemctl restart docker
|
||||||
|
|
||||||
|
# Result: root in container = unprivileged user on host
|
||||||
|
```
|
||||||
|
|
||||||
|
### SELinux Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check SELinux status
|
||||||
|
sestatus
|
||||||
|
|
||||||
|
# Run container with SELinux enabled
|
||||||
|
docker run --security-opt label=type:svirt_sandbox_file_t myimage
|
||||||
|
|
||||||
|
# Volume labels
|
||||||
|
docker run -v /host/path:/container/path:z myimage # Private label
|
||||||
|
docker run -v /host/path:/container/path:Z myimage # Shared label
|
||||||
|
```
|
||||||
|
|
||||||
|
### AppArmor Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check AppArmor status
|
||||||
|
sudo aa-status
|
||||||
|
|
||||||
|
# Run with default Docker profile
|
||||||
|
docker run --security-opt apparmor=docker-default myimage
|
||||||
|
|
||||||
|
# Create custom profile
|
||||||
|
sudo aa-genprof docker run myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
### Systemd Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check Docker service status
|
||||||
|
sudo systemctl status docker
|
||||||
|
|
||||||
|
# Enable on boot
|
||||||
|
sudo systemctl enable docker
|
||||||
|
|
||||||
|
# Restart Docker
|
||||||
|
sudo systemctl restart docker
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
sudo journalctl -u docker -f
|
||||||
|
|
||||||
|
# Configure service
|
||||||
|
sudo systemctl edit docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### cgroup v1 vs v2
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check cgroup version
|
||||||
|
stat -fc %T /sys/fs/cgroup/
|
||||||
|
|
||||||
|
# If using cgroup v2, ensure Docker version >= 20.10
|
||||||
|
|
||||||
|
# /etc/docker/daemon.json
|
||||||
|
{
|
||||||
|
"exec-opts": ["native.cgroupdriver=systemd"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux Distribution Specifics
|
||||||
|
|
||||||
|
**Ubuntu/Debian:**
|
||||||
|
```bash
|
||||||
|
# Install Docker
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install ca-certificates curl
|
||||||
|
sudo install -m 0755 -d /etc/apt/keyrings
|
||||||
|
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
||||||
|
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||||||
|
|
||||||
|
echo \
|
||||||
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||||
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||||||
|
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
|
# Non-root user
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
**RHEL/CentOS/Fedora:**
|
||||||
|
```bash
|
||||||
|
# Install Docker
|
||||||
|
sudo dnf -y install dnf-plugins-core
|
||||||
|
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
|
||||||
|
sudo dnf install docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
|
# Start Docker
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo systemctl enable docker
|
||||||
|
|
||||||
|
# Non-root user
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
**Alpine:**
|
||||||
|
```bash
|
||||||
|
# Install Docker
|
||||||
|
apk add docker docker-compose
|
||||||
|
|
||||||
|
# Start Docker
|
||||||
|
rc-update add docker boot
|
||||||
|
service docker start
|
||||||
|
```
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
### Architecture
|
||||||
|
|
||||||
|
- **Docker Desktop:** Required (no native Docker on macOS)
|
||||||
|
- **Virtualization:** Uses HyperKit (Intel) or Virtualization.framework (Apple Silicon)
|
||||||
|
- **Linux VM:** Containers run in lightweight Linux VM
|
||||||
|
- **File sharing:** osxfs or VirtioFS for bind mounts
|
||||||
|
|
||||||
|
### macOS-Specific Considerations
|
||||||
|
|
||||||
|
**Resource Allocation:**
|
||||||
|
```
|
||||||
|
Docker Desktop → Preferences → Resources → Advanced
|
||||||
|
- CPUs: Allocate based on workload (default: half available)
|
||||||
|
- Memory: Allocate generously (default: 2GB, recommend 4-8GB)
|
||||||
|
- Swap: 1GB minimum
|
||||||
|
- Disk image size: 60GB+ for development
|
||||||
|
```
|
||||||
|
|
||||||
|
**File Sharing Performance:**
|
||||||
|
|
||||||
|
Traditional osxfs is slow. Improvements:
|
||||||
|
1. **VirtioFS:** Enable in Docker Desktop settings (faster)
|
||||||
|
2. **Delegated/Cached mounts:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
# Host writes delayed (best for source code)
|
||||||
|
- ./src:/app/src:delegated
|
||||||
|
|
||||||
|
# Container writes cached (best for build outputs)
|
||||||
|
- ./build:/app/build:cached
|
||||||
|
|
||||||
|
# Default consistency (slowest but safest)
|
||||||
|
- ./data:/app/data:consistent
|
||||||
|
```
|
||||||
|
|
||||||
|
**Network Access:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Access host from container
|
||||||
|
host.docker.internal
|
||||||
|
|
||||||
|
# Example: Connect to host PostgreSQL
|
||||||
|
docker run -e DATABASE_URL=postgresql://host.docker.internal:5432/db myapp
|
||||||
|
```
|
||||||
|
|
||||||
|
### Apple Silicon (M1/M2/M3) Specifics
|
||||||
|
|
||||||
|
**Architecture Considerations:**
|
||||||
|
```bash
|
||||||
|
# Check image architecture
|
||||||
|
docker image inspect node:20-alpine | grep Architecture
|
||||||
|
|
||||||
|
# M-series Macs are ARM64
|
||||||
|
# Some images only available for AMD64
|
||||||
|
|
||||||
|
# Build multi-platform
|
||||||
|
docker buildx build --platform linux/amd64,linux/arm64 -t myapp .
|
||||||
|
|
||||||
|
# Run AMD64 image on ARM (via emulation)
|
||||||
|
docker run --platform linux/amd64 myimage # Slower
|
||||||
|
```
|
||||||
|
|
||||||
|
**Rosetta 2 Integration:**
|
||||||
|
```
|
||||||
|
Docker Desktop → Features in development → Use Rosetta for x86/amd64 emulation
|
||||||
|
```
|
||||||
|
Faster AMD64 emulation on Apple Silicon.
|
||||||
|
|
||||||
|
### macOS Docker Desktop Settings
|
||||||
|
|
||||||
|
**General:**
|
||||||
|
- ✅ Start Docker Desktop when you log in
|
||||||
|
- ✅ Use VirtioFS (better performance)
|
||||||
|
- ✅ Use Virtualization framework (Apple Silicon)
|
||||||
|
|
||||||
|
**Resources:**
|
||||||
|
```
|
||||||
|
CPUs: 4-6 (for development)
|
||||||
|
Memory: 6-8 GB (for development)
|
||||||
|
Swap: 1-2 GB
|
||||||
|
Disk image size: 100+ GB (grows dynamically)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Docker Engine:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"builder": {
|
||||||
|
"gc": {
|
||||||
|
"enabled": true,
|
||||||
|
"defaultKeepStorage": "20GB"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"experimental": false,
|
||||||
|
"features": {
|
||||||
|
"buildkit": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### macOS File Permissions
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# macOS user ID and group ID
|
||||||
|
id -u # Usually 501
|
||||||
|
id -g # Usually 20
|
||||||
|
|
||||||
|
# Match in container
|
||||||
|
docker run --user 501:20 myimage
|
||||||
|
|
||||||
|
# Or in Dockerfile
|
||||||
|
RUN adduser -u 501 -g 20 appuser
|
||||||
|
USER appuser
|
||||||
|
```
|
||||||
|
|
||||||
|
### macOS Development Workflow
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml for development
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
volumes:
|
||||||
|
# Source code with delegated (better performance)
|
||||||
|
- ./src:/app/src:delegated
|
||||||
|
# node_modules in volume (much faster than bind mount)
|
||||||
|
- node_modules:/app/node_modules
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
node_modules:
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common macOS Issues
|
||||||
|
|
||||||
|
**Problem:** Slow file sync
|
||||||
|
**Solution:**
|
||||||
|
- Use VirtioFS
|
||||||
|
- Use delegated/cached mounts
|
||||||
|
- Store dependencies in volumes (not bind mounts)
|
||||||
|
|
||||||
|
**Problem:** High CPU usage
|
||||||
|
**Solution:**
|
||||||
|
- Reduce file watching
|
||||||
|
- Exclude large directories from file sharing
|
||||||
|
- Allocate more resources
|
||||||
|
|
||||||
|
**Problem:** Port already in use
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Find process using port
|
||||||
|
lsof -i :PORT
|
||||||
|
kill -9 PID
|
||||||
|
```
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
### Windows Container Types
|
||||||
|
|
||||||
|
**1. Linux Containers on Windows (LCOW):**
|
||||||
|
- Most common for development
|
||||||
|
- Uses WSL2 or Hyper-V backend
|
||||||
|
- Runs Linux containers
|
||||||
|
- Good compatibility
|
||||||
|
|
||||||
|
**2. Windows Containers:**
|
||||||
|
- Native Windows containers
|
||||||
|
- For Windows-specific workloads
|
||||||
|
- Requires Windows Server base images
|
||||||
|
- Less common in development
|
||||||
|
|
||||||
|
### Windows Backend Options
|
||||||
|
|
||||||
|
**WSL2 Backend (Recommended):**
|
||||||
|
- Faster
|
||||||
|
- Better resource usage
|
||||||
|
- Native Linux kernel
|
||||||
|
- Requires Windows 10/11 (recent versions)
|
||||||
|
|
||||||
|
**Hyper-V Backend:**
|
||||||
|
- Older option
|
||||||
|
- More resource intensive
|
||||||
|
- Works on older Windows versions
|
||||||
|
|
||||||
|
### WSL2 Configuration
|
||||||
|
|
||||||
|
**Enable WSL2:**
|
||||||
|
```powershell
|
||||||
|
# Run as Administrator
|
||||||
|
wsl --install
|
||||||
|
|
||||||
|
# Or manually
|
||||||
|
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
||||||
|
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
|
||||||
|
|
||||||
|
# Set WSL2 as default
|
||||||
|
wsl --set-default-version 2
|
||||||
|
|
||||||
|
# Install Ubuntu (or other distro)
|
||||||
|
wsl --install -d Ubuntu
|
||||||
|
```
|
||||||
|
|
||||||
|
**Docker Desktop Integration:**
|
||||||
|
```
|
||||||
|
Settings → Resources → WSL Integration
|
||||||
|
- Enable integration with default distro
|
||||||
|
- Select additional distros
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows Path Considerations
|
||||||
|
|
||||||
|
**Path Formats:**
|
||||||
|
```bash
|
||||||
|
# Forward slashes (recommended, works everywhere)
|
||||||
|
docker run -v C:/Users/name/project:/app myimage
|
||||||
|
|
||||||
|
# Backslashes (need escaping in some contexts)
|
||||||
|
docker run -v C:\Users\name\project:/app myimage
|
||||||
|
|
||||||
|
# In docker-compose.yml (forward slashes)
|
||||||
|
volumes:
|
||||||
|
- C:/Users/name/project:/app
|
||||||
|
|
||||||
|
# Or relative paths
|
||||||
|
volumes:
|
||||||
|
- ./src:/app/src
|
||||||
|
```
|
||||||
|
|
||||||
|
### Git Bash / MINGW Path Conversion Issues
|
||||||
|
|
||||||
|
**CRITICAL ISSUE:** When using Docker in Git Bash (MINGW) on Windows, automatic path conversion breaks volume mounts.
|
||||||
|
|
||||||
|
**The Problem:**
|
||||||
|
```bash
|
||||||
|
# What you type in Git Bash:
|
||||||
|
docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# What Git Bash converts it to (BROKEN):
|
||||||
|
docker run -v C:\Program Files\Git\d\repos\project:/app myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solutions:**
|
||||||
|
|
||||||
|
**1. MSYS_NO_PATHCONV (Recommended):**
|
||||||
|
```bash
|
||||||
|
# Per-command fix
|
||||||
|
MSYS_NO_PATHCONV=1 docker run -v $(pwd):/app myimage
|
||||||
|
|
||||||
|
# Session-wide fix (add to ~/.bashrc)
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
|
||||||
|
# Function wrapper (automatic for all Docker commands)
|
||||||
|
docker() {
|
||||||
|
(export MSYS_NO_PATHCONV=1; command docker.exe "$@")
|
||||||
|
}
|
||||||
|
export -f docker
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Double Slash Workaround:**
|
||||||
|
```bash
|
||||||
|
# Use double leading slash to prevent conversion
|
||||||
|
docker run -v //c/Users/project:/app myimage
|
||||||
|
|
||||||
|
# Works with $(pwd) too
|
||||||
|
docker run -v //$(pwd):/app myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Named Volumes (No Path Issues):**
|
||||||
|
```bash
|
||||||
|
# Named volumes work without any fixes
|
||||||
|
docker run -v my-data:/data myimage
|
||||||
|
```
|
||||||
|
|
||||||
|
**What Works Without Modification:**
|
||||||
|
- Docker Compose YAML files with relative paths
|
||||||
|
- Named volumes
|
||||||
|
- Network and image commands
|
||||||
|
- Container commands without volumes
|
||||||
|
|
||||||
|
**What Needs MSYS_NO_PATHCONV:**
|
||||||
|
- Bind mounts with `$(pwd)`
|
||||||
|
- Bind mounts with absolute Unix-style paths
|
||||||
|
- Volume mounts specified on command line
|
||||||
|
|
||||||
|
**Shell Detection:**
|
||||||
|
```bash
|
||||||
|
# Detect Git Bash/MINGW and auto-configure
|
||||||
|
if [ -n "$MSYSTEM" ] || [[ "$(uname -s)" == MINGW* ]]; then
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
echo "Git Bash detected - Docker path conversion fix enabled"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**Recommended ~/.bashrc Configuration:**
|
||||||
|
```bash
|
||||||
|
# Docker on Git Bash fix
|
||||||
|
if [ -n "$MSYSTEM" ]; then
|
||||||
|
export MSYS_NO_PATHCONV=1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
See the `docker-git-bash-guide` skill for comprehensive path conversion documentation, troubleshooting, and examples.
|
||||||
|
|
||||||
|
### Windows File Sharing
|
||||||
|
|
||||||
|
**Configure Shared Drives:**
|
||||||
|
```
|
||||||
|
Docker Desktop → Settings → Resources → File Sharing
|
||||||
|
Add: C:\, D:\, etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Performance Considerations:**
|
||||||
|
- File sharing is slower than Linux/Mac
|
||||||
|
- Use WSL2 backend for better performance
|
||||||
|
- Store frequently accessed files in WSL2 filesystem
|
||||||
|
|
||||||
|
### Windows Line Endings
|
||||||
|
|
||||||
|
**Problem:** CRLF vs LF line endings
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```bash
|
||||||
|
# Git configuration
|
||||||
|
git config --global core.autocrlf input
|
||||||
|
|
||||||
|
# Or per-repo (.gitattributes)
|
||||||
|
* text=auto
|
||||||
|
*.sh text eol=lf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
```
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# In Dockerfile for scripts
|
||||||
|
FROM alpine
|
||||||
|
COPY --chmod=755 script.sh /
|
||||||
|
# Ensure LF endings
|
||||||
|
RUN dos2unix /script.sh || sed -i 's/\r$//' /script.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows Firewall
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Allow Docker Desktop
|
||||||
|
New-NetFirewallRule -DisplayName "Docker Desktop" -Direction Inbound -Program "C:\Program Files\Docker\Docker\Docker Desktop.exe" -Action Allow
|
||||||
|
|
||||||
|
# Check blocked ports
|
||||||
|
netstat -ano | findstr :PORT
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows-Specific Docker Commands
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Run PowerShell in container
|
||||||
|
docker run -it mcr.microsoft.com/powershell:lts-7.4-windowsservercore-ltsc2022
|
||||||
|
|
||||||
|
# Windows container example
|
||||||
|
docker run -it mcr.microsoft.com/windows/servercore:ltsc2022 cmd
|
||||||
|
|
||||||
|
# Check container type
|
||||||
|
docker info | Select-String "OSType"
|
||||||
|
```
|
||||||
|
|
||||||
|
### WSL2 Disk Management
|
||||||
|
|
||||||
|
**Problem:** WSL2 VHDX grows but doesn't shrink
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```powershell
|
||||||
|
# Stop Docker Desktop and WSL
|
||||||
|
wsl --shutdown
|
||||||
|
|
||||||
|
# Compact disk image (run as Administrator)
|
||||||
|
# Method 1: Optimize-VHD (requires Hyper-V tools)
|
||||||
|
Optimize-VHD -Path "$env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx" -Mode Full
|
||||||
|
|
||||||
|
# Method 2: diskpart
|
||||||
|
diskpart
|
||||||
|
# In diskpart:
|
||||||
|
select vdisk file="C:\Users\YourName\AppData\Local\Docker\wsl\data\ext4.vhdx"
|
||||||
|
attach vdisk readonly
|
||||||
|
compact vdisk
|
||||||
|
detach vdisk
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows Development Workflow
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml for Windows
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
volumes:
|
||||||
|
# Use forward slashes
|
||||||
|
- ./src:/app/src
|
||||||
|
# Named volumes for better performance
|
||||||
|
- node_modules:/app/node_modules
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
# Windows-specific: ensure proper line endings
|
||||||
|
command: sh -c "dos2unix /app/scripts/*.sh && npm start"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
node_modules:
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common Windows Issues
|
||||||
|
|
||||||
|
**Problem:** Permission denied errors
|
||||||
|
**Solution:**
|
||||||
|
```powershell
|
||||||
|
# Run Docker Desktop as Administrator
|
||||||
|
# Or grant permissions to Docker Desktop
|
||||||
|
icacls "C:\ProgramData\DockerDesktop" /grant Users:F /T
|
||||||
|
```
|
||||||
|
|
||||||
|
**Problem:** Slow performance
|
||||||
|
**Solution:**
|
||||||
|
- Use WSL2 backend
|
||||||
|
- Store project in WSL2 filesystem (`\\wsl$\Ubuntu\home\user\project`)
|
||||||
|
- Use named volumes for node_modules, etc.
|
||||||
|
|
||||||
|
**Problem:** Path not found
|
||||||
|
**Solution:**
|
||||||
|
- Use forward slashes
|
||||||
|
- Ensure drive is shared in Docker Desktop
|
||||||
|
- Use absolute paths or `${PWD}`
|
||||||
|
|
||||||
|
## Platform Comparison
|
||||||
|
|
||||||
|
| Feature | Linux | macOS | Windows |
|
||||||
|
|---------|-------|-------|---------|
|
||||||
|
| **Performance** | Excellent (native) | Good (VM overhead) | Good (WSL2) to Fair (Hyper-V) |
|
||||||
|
| **File sharing** | Native | Slow (improving with VirtioFS) | Slow (better in WSL2) |
|
||||||
|
| **Resource efficiency** | Best | Good | Good (WSL2) |
|
||||||
|
| **Feature set** | Complete | Complete | Complete (LCOW) |
|
||||||
|
| **Production** | Standard | Dev only | Dev only (LCOW) |
|
||||||
|
| **Ease of use** | Moderate | Easy (Docker Desktop) | Easy (Docker Desktop) |
|
||||||
|
| **Cost** | Free | Free (Docker Desktop Personal) | Free (Docker Desktop Personal) |
|
||||||
|
|
||||||
|
## Cross-Platform Best Practices
|
||||||
|
|
||||||
|
### Multi-Platform Images
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create buildx builder
|
||||||
|
docker buildx create --name multiplatform --driver docker-container --use
|
||||||
|
|
||||||
|
# Build for multiple platforms
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64,linux/arm64,linux/arm/v7 \
|
||||||
|
-t myimage:latest \
|
||||||
|
--push \
|
||||||
|
.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Platform-Agnostic Dockerfiles
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Works on all platforms
|
||||||
|
FROM node:20-alpine
|
||||||
|
|
||||||
|
# Use COPY with --chmod (not RUN chmod, which is slower)
|
||||||
|
COPY --chmod=755 script.sh /usr/local/bin/
|
||||||
|
|
||||||
|
# Use environment variables for paths
|
||||||
|
ENV APP_HOME=/app
|
||||||
|
WORKDIR ${APP_HOME}
|
||||||
|
|
||||||
|
# Use exec form for CMD/ENTRYPOINT (works on Windows containers too)
|
||||||
|
CMD ["node", "server.js"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cross-Platform Compose Files
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
volumes:
|
||||||
|
# Relative paths work everywhere
|
||||||
|
- ./src:/app/src
|
||||||
|
# Named volumes (platform-agnostic)
|
||||||
|
- data:/app/data
|
||||||
|
environment:
|
||||||
|
# Use environment variables
|
||||||
|
- NODE_ENV=${NODE_ENV:-development}
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
|
```
|
||||||
|
|
||||||
|
### Testing Across Platforms
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test on different platforms with buildx
|
||||||
|
docker buildx build --platform linux/amd64 -t myapp:amd64 --load .
|
||||||
|
docker run --rm myapp:amd64
|
||||||
|
|
||||||
|
docker buildx build --platform linux/arm64 -t myapp:arm64 --load .
|
||||||
|
docker run --rm myapp:arm64
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform Selection Guide
|
||||||
|
|
||||||
|
**Choose Linux for:**
|
||||||
|
- Production deployments
|
||||||
|
- Maximum performance
|
||||||
|
- Full Docker feature set
|
||||||
|
- Minimal overhead
|
||||||
|
- CI/CD pipelines
|
||||||
|
|
||||||
|
**Choose macOS for:**
|
||||||
|
- Development on Mac hardware
|
||||||
|
- When you need macOS tools
|
||||||
|
- Docker Desktop ease of use
|
||||||
|
- M1/M2/M3 development
|
||||||
|
|
||||||
|
**Choose Windows for:**
|
||||||
|
- Development on Windows hardware
|
||||||
|
- Windows-specific applications
|
||||||
|
- When team uses Windows
|
||||||
|
- WSL2 for better Linux container support
|
||||||
|
|
||||||
|
This platform guide covers the major differences. Always test on your target deployment platform before going to production.
|
||||||
1004
skills/docker-security-guide.md
Normal file
1004
skills/docker-security-guide.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user