November 18, 2025 - Docker Optimization for ML Models
🐳 Optimization Mission
Reduced Docker image size for machine learning model deployment by 40% while maintaining performance.
📦 Before Optimization
FROM python:3.9
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
CMD ["python", "app.py"]Image Size: 1.2GB
🚀 After Optimization
# Multi-stage build
FROM python:3.9-alpine as builder
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Final stage
FROM python:3.9-alpine
RUN addgroup -g 1000 -S appgroup && \
adduser -u 1000 -S appuser -G appgroup
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY --chown=appuser:appgroup . .
USER appuser
CMD ["python", "app.py"]Image Size: 720MB
🔧 Key Optimizations
1. Multi-stage Builds
- Separate build and runtime environments
- Only copy necessary artifacts to final image
2. Base Image Selection
- Switched from full Python to Alpine
- Significant size reduction with trade-offs
3. Layer Optimization
- Order Dockerfile commands by frequency of change
- Combine RUN commands when possible
4. Security Improvements
- Non-root user execution
- Minimal attack surface
📊 Performance Metrics
| Metric | Before | After | Improvement |
|---|---|---|---|
| Image Size | 1.2GB | 720MB | 40% smaller |
| Build Time | 8m | 6m | 25% faster |
| Startup | 45s | 38s | 16% faster |
| Memory Usage | 512MB | 480MB | 6% less |
⚠️ Trade-offs
Alpine Linux Considerations
# Some packages need special handling
# Problem: numpy installation on Alpine
RUN apk add --no-cache gcc musl-dev && \
pip install numpy && \
apk del gcc musl-devBinary Compatibility
- Some compiled packages behave differently
- Need thorough testing before production deployment
🎯 Best Practices Learned
1. .dockerignore
.git
.pytest_cache
.coverage
.venv
__pycache__
*.pyc2. Health Checks
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8000/health || exit 13. Resource Limits
# docker-compose.yml
services:
ml-service:
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'🔮 Future Improvements
Advanced Optimizations
- Distroless images for production
- BuildKit cache mounts for faster builds
- BentoML for ML-specific containers
Monitoring
- Prometheus metrics inside containers
- Resource usage tracking
- Automated image scanning for security
Mood: 😎 Proud of the results Containers Optimized: 3 Memory Saved: 480MB total