
Hata 1: Devasa Temel İmaj
Kod:
# ŞİŞKO (~1 GB)
FROM node:20
# ZAYIF (~180 MB)
FROM node:20-alpine
# EN ZAYIF (~80 MB, çok aşamalı ile)
FROM node:20-alpine AS builder
Alpine, glibc yerine musl kullanır. Bazı yerel (native) modüller derlenmezse
slim etiketini deneyin — yine de büyük kazanç sağlar.
Hata 2: Çok Aşamalı Derleme Kullanmamak
Derleme araçlarını üretim imajına taşımayın:
Kod:
# 1. Aşama: derle
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 2. Aşama: sadece çalıştır
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]
Hata 3: Katman Sırasını Yanlış Kurmak
Kod:
# YANLIŞ: her kod değişikliğinde npm install baştan
COPY . .
RUN npm ci
# DOĞRU: bağımlılıklar önbelleğe alınır
COPY package*.json ./
RUN npm ci
COPY . .
Hata 4: .dockerignore Yazmamak
Kod:
.git
node_modules
*.log
.env
coverage
Dockerfile
README.md
.git klasörü tek başına yüzlerce MB olabilir.
Hata 5: Her Komut İçin Ayrı RUN
Kod:
# YANLIŞ: 3 katman, önbellek dosyaları kalır
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*
# DOĞRU: tek katman, temizlik dahil
RUN apt-get update && \
apt-get install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*
Hata 6: Geliştirme Bağımlılıklarını Taşımak
Kod:
RUN npm ci --omit=dev
Hata 7: root Kullanıcıyla Çalıştırmak
Kod:
RUN addgroup -S app && adduser -S app -G app
USER app
Hata 8: latest Etiketi Kullanmak
Bugün çalışan derleme, yarın patlar. Sürümü sabitleyin: node:20.11-alpine
Hata 9: Sağlık Kontrolü Koymamak
Kod:
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -qO- http://localhost:3000/health || exit 1
Hata 10: Ne Şiştiğini Ölçmemek
Bash:
docker images # Boyutları gör
docker history imaj:etiket # Hangi katman şişirmiş?
docker system prune -a # Çöpü temizle
dive aracıyla imajı katman katman gezip hangi dosyaların yer kapladığını görebilirsiniz. Şaşırtıcı sonuçlar çıkar.
Gerçek Sonuç
Kod:
Adım Boyut Derleme
-------------------------- -------- ---------
Başlangıç (node:20) 1.180 MB 4 dk 10 sn
Alpine'a geçiş 412 MB 3 dk 40 sn
Çok aşamalı derleme 186 MB 2 dk 05 sn
--omit=dev + .dockerignore 94 MB 1 dk 20 sn
Katman sırası düzeltmesi 94 MB 22 sn
Kontrol Listesi
- Alpine veya slim temel imaj
- Çok aşamalı derleme
- Bağımlılıklar koddan önce kopyalanıyor
- .dockerignore dosyası var
- Geliştirme bağımlılıkları hariç
- root olmayan kullanıcı
- Sürüm etiketi sabit