Docker Multi-Stage Builds, production image'larınızı küçük, güvenli ve hızlı hale getirmenin en etkili yöntemidir. Tek bir Dockerfile ile build ortamını ve production ortamını birbirinden tamamen ayırabilirsiniz.
Neden Multi-Stage?
- Build araçları (compiler, test runner) production image'a girmez
- Image boyutu dramatik biçimde küçülür
- Saldırı yüzeyi azalır, güvenlik artar
- CI/CD pipeline'ları hızlanır
Node.js Uygulaması için Örnek
# Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Stage 2: Production FROM node:20-alpine AS production WORKDIR /app ENV NODE_ENV=production COPY package*.json ./ RUN npm ci --only=production && npm cache clean --force COPY --from=builder /app/dist ./dist EXPOSE 3000 USER node CMD ["node", "dist/index.js"]
Sonuçlar
- Tek stage: 1.2 GB
- Multi-stage: 180 MB — %85 küçülme
Alpine vs Distroless
Alpine Linux küçük ama musl libc kullanır. Google'ın Distroless image'ları ise shell bile içermez, maksimum güvenlik için idealdir.
# Distroless ile daha da küçük ve güvenli FROM gcr.io/distroless/nodejs20-debian12 COPY --from=builder /app/dist /app/dist WORKDIR /app CMD ["dist/index.js"]
Sonuç
Multi-stage builds, modern Docker workflow'unun olmazsa olmazı. Hem geliştirme hem production için ayrı stage'ler tanımlayarak hem hız hem güvenlik kazanırsınız.