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
- Multi-stage builds
- Optimize layer order
- Use .dockerignore
- Minimize image size
- Security scanning
Conclusion
Build efficient Docker images! 🐳