Introduction
Inefficient Docker builds waste time and CI/CD resources. Understanding layer caching and optimizing your Dockerfile structure can reduce build times by 80% or more.
Symptoms
- Every build reinstalls all dependencies
- No layer caching in CI/CD pipelines
- Large final image sizes
- Build context taking too long to transfer
Step-by-Step Fix
- 1.Order Dockerfile instructions by change frequency:
- 2.```dockerfile
- 3.# Base image - rarely changes
- 4.FROM node:18-alpine
# System deps - change occasionally RUN apk add --no-cache python3 make g++
# Dependencies - change when package.json updates WORKDIR /app COPY package*.json ./ RUN npm ci --only=production
# Application code - changes frequently COPY . . ```
- 1.Use BuildKit mount caching for package managers:
- 2.```dockerfile
- 3.# syntax=docker/dockerfile:1
- 4.RUN --mount=type=cache,target=/root/.npm \
- 5.npm ci
- 6.
` - 7.Implement multi-stage builds:
- 8.```dockerfile
- 9.# Build stage
- 10.FROM node:18 AS builder
- 11.WORKDIR /app
- 12.COPY package*.json ./
- 13.RUN npm ci
- 14.COPY . .
- 15.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/main.js"] ```