6 rules
- Use a small base (alpine/distroless when possible)
- Copy only what you need (use
.dockerignore) - Install deps before copying app source
- Combine commands to reduce layers
- Use multi-stage builds
- Pin versions to avoid surprise rebuilds
FROM node:24-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM gcr.io/distroless/nodejs24-debian12
COPY --from=build /app/dist /app
CMD ["/app/index.js"]