Software Craftsmanship

The Docker Multi-Stage Build Trick That Reduced My Images by 90%

The Docker Multi-Stage Build Trick That Reduced My Images by 90%

Your Docker images are bloated. Here's the fix. 📦

Before: 1.2GB Node.js image After: 120MB production image Secret: Multi-stage builds

The Problem: Most Dockerfiles include everything: • Development dependencies • Build tools • Source code • Package managers • Documentation

The Solution:

# Stage 1: Build
FROM node:18 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Production
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["npm", "start"]

Why This Works: • Build stage has all tools needed to compile • Production stage only gets the compiled output • Alpine base image is tiny (5MB vs 900MB) • No dev dependencies in final image

Pro Tips: • Use .dockerignore to exclude unnecessary files • Order COPY commands by change frequency • Use specific base image tags (not latest) • Consider distroless images for even smaller size

Other Benefits: • Faster deployments (smaller images) • Reduced attack surface (fewer packages) • Lower storage costs • Faster container startup

For Other Languages: • Go: Use scratch or alpine for final stage • Java: Use JRE instead of JDK in final stage • Python: Use python:slim or alpine

Your deployment pipeline will thank you.

What's your Docker image optimization secret? 🐳

#Docker#DevOps#Containerization#Optimization#CloudNative