Docker Best Practices
14. Docker Best Practices
Section titled “14. Docker Best Practices”✅ Production Image Checklist
Section titled “✅ Production Image Checklist”# syntax=docker/dockerfile:1
# ① Pin exact versions — no 'latest'FROM node:18.17.0-alpine3.18
# ② Set working directoryWORKDIR /app
# ③ Create non-root user earlyRUN addgroup -S app && adduser -S app -G app
# ④ Copy dependency files first (cache optimization)COPY --chown=app:app package*.json ./RUN npm ci --only=production && npm cache clean --force
# ⑤ Copy source code lastCOPY --chown=app:app src/ ./src/
# ⑥ Switch to non-rootUSER app
# ⑦ Expose port as documentationEXPOSE 3000
# ⑧ Add health checkHEALTHCHECK --interval=30s --timeout=5s --retries=3 \ CMD wget -qO- http://localhost:3000/health || exit 1
# ⑨ Use exec form for CMD (no shell wrapper)CMD ["node", "src/server.js"]🏷️ Image Tagging Conventions
Section titled “🏷️ Image Tagging Conventions”# Semantic versioning (recommended)myapp:1.0.0 # Exact releasemyapp:1.0 # Minor version familymyapp:1 # Major version familymyapp:latest # Latest stable (auto-updated)
# Git SHA tags (for traceability)myapp:sha-a3f5b2c # Exact commit
# Environment tagsmyapp:1.0.0-devmyapp:1.0.0-stagingmyapp:1.0.0-prod
# Full production tagging workflowVERSION=1.0.0GIT_SHA=$(git rev-parse --short HEAD)docker tag myapp registry.io/myapp:${VERSION}docker tag myapp registry.io/myapp:${VERSION}-${GIT_SHA}docker tag myapp registry.io/myapp:latest🧹 Regular Cleanup
Section titled “🧹 Regular Cleanup”# Check Docker disk usagedocker system df
# Aggressive cleanup (removes everything unused)docker system prune -a --volumes
# Targeted cleanup (safer)docker container prune # Remove stopped containersdocker image prune -a # Remove unused imagesdocker volume prune # Remove unused volumesdocker network prune # Remove unused networks
# Remove images older than 24hdocker image prune -a --filter "until=24h"