İyi bir Dockerfile nasıl yazılır? Multi-stage build ne işe yarar?

Cevap

Örnek: Node.js için multi-stage Dockerfile

# 1. aşama: bağımlılıklar ve build
FROM node:20-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --omit=dev

# 2. aşama: yalnızca çalışma zamanı
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build --chown=node:node /app/node_modules ./node_modules
COPY --from=build --chown=node:node /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

Multi-stage build, derleyici, dev bağımlılıkları ve kaynak kodu gibi yalnızca build sırasında gereken her şeyi ilk aşamada bırakır. Son image yalnızca çalışması gerekenleri içerir: daha küçük boyut, daha hızlı dağıtım, daha az güvenlik açığı yüzeyi. Go gibi derlenen dillerde son aşama distroless veya scratch olabilir.

Best practice'ler

  1. Layer cache'i doğru kullanın: az değişen dosyaları önce kopyalayın. Önce package.json kopyalanıp npm ci çalıştırılır; böylece yalnızca kod değiştiğinde bağımlılıklar yeniden kurulmaz.
  2. Küçük ve sabit base image: node:20-alpine veya -slim; latest etiketi yerine sürüm belirtin.
  3. `.dockerignore`: node_modules, .git, .env, test çıktıları image'a girmesin.
  4. Root olarak çalıştırmayın: USER node veya kendi oluşturduğunuz kullanıcı.
  5. RUN komutlarını birleştirin ve aynı katmanda temizlik yapın: apt-get update && apt-get install -y x && rm -rf /var/lib/apt/lists/*
  6. Secret'ları image'a gömmeyin: ENV API_KEY=... veya COPY .env image geçmişinde kalır. Build sırasında gerekiyorsa RUN --mount=type=secret kullanın.
  7. Exec form CMD: CMD ["node", "server.js"]. Shell form (CMD node server.js) sinyalleri sürece iletmez; docker stop sonrası graceful shutdown çalışmaz.
  8. Image'ları docker scout veya trivy ile güvenlik açıklarına karşı tarayın.
  1. Ortam değişkenleri ve secret'lar (şifre, API anahtarı) güvenli şekilde nasıl yönetilir?OrtaDocker & DevOpsBackend
  2. CI/CD nedir? Tipik bir backend CI/CD pipeline'ının aşamaları nelerdir?OrtaDocker & DevOpsBackend
  3. Docker Compose ne işe yarar? Basit bir örnekle açıklayın.KolayDocker & DevOpsBackend
  4. Container ile sanal makine (VM) arasındaki fark nedir?KolayDocker & DevOpsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle