müfettiş
Moderatör
- Katılım
- 20 Ocak 2024
- Mesajlar
- 325
- Tepkime puanı
- 1
- Puanları
- 18
Docker Build Sürecini Hızlandırma: Cache ve Multi-stage Build Kullanımı
Giriş: "Build Süresi Neden 10 Dakika?"
CI/CD süreçlerinin en büyük düşmanı yavaş "Build" süreleridir. Bir geliştirici tek satır kod değiştirdiğinde, yeni Docker imajının oluşması için 10 dakika bekliyorsa, orada bir verimsizlik vardır. Ayrıca 1 GB boyutundaki imajları sunuculara transfer etmek hem ağ trafiğini tıkar hem de dağıtımı (Deployment) geciktirir.Bu makalede, Dockerfile'ınızı optimize ederek build süresini saniyelere, imaj boyutunu ise megabaytlara nasıl düşüreceğinizi inceleyeceğiz.
1. Layer Caching (Katman Önbelleği) Sanatı
Docker, Dockerfile içindeki her satırı (RUN, COPY, ADD) ayrı bir "Katman" (Layer) olarak işler ve bunları önbelleğe alır. Eğer bir satır değişmezse, Docker o işlemi tekrar yapmaz, önbellekten getirir.Altın Kural: En az değişen şeyleri en üste, en sık değişen şeyleri (kaynak kod) en alta yazın.Kötü Örnek:
Kod:
COPY . . (Kaynak kod her değiştiğinde bu satır değişir)
RUN npm install (Kod değiştiği için önbellek bozulur, her seferinde kütüphaneleri tekrar indirir!)
İyi Örnek:
Dockerfile
Kod:
COPY package.json . (Sadece kütüphane listesi değişince burası değişir)
RUN npm install (Kütüphaneler değişmediyse burayı önbellekten çeker - HIZ KAZANCI)
COPY . . (Kaynak kod değişse bile üst satırlar tekrar çalışmaz)
2. Multi-stage Builds (Çok Aşamalı İnşa)
Uygulamayı derlemek için gereken araçlar (GCC, Maven, Go Compiler), uygulamanın çalışması için gerekli değildir. Bunları son imaja koymak güvenlik açığıdır ve boyutu şişirir.Multi-stage build ile "İnşaat Sahası" ve "Oturma Odası"nı ayırırız.Örnek (Golang Uygulaması):
Dockerfile
Kod:
# Aşama 1: Builder (İnşaat Sahası) - 1 GB Boyutunda
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go
# Aşama 2: Runner (Oturma Odası) - 10 MB Boyutunda
FROM alpine:latest
WORKDIR /root/
# Sadece derlenmiş dosyayı kopyala, kaynak kod ve compiler çöpe gider
COPY --from=builder /app/myapp .
CMD ["./myapp"]