Building efficient Docker images requires following best practices. Here’s how.

1. Use Multi-Stage Builds

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

# Production stage
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

2. Layer Caching

# Bad: Changes invalidate cache
COPY . .
RUN npm install

# Good: Dependencies cached
COPY package*.json ./
RUN npm install
COPY . .

3. Use .dockerignore

node_modules
.git
.env
dist
*.log

4. Minimize Layers

# Bad: Multiple layers
RUN apt-get update
RUN apt-get install -y python
RUN apt-get install -y git

# Good: Single layer
RUN apt-get update && \
    apt-get install -y python git && \
    rm -rf /var/lib/apt/lists/*

5. Use Specific Tags

# Bad: Latest tag
FROM node:latest

# Good: Specific version
FROM node:18.17.0-alpine

Best Practices

  1. Multi-stage builds
  2. Optimize layer order
  3. Use .dockerignore
  4. Minimize image size
  5. Security scanning

Conclusion

Build efficient Docker images! 🐳