Docker görüntülerini optimize etmek için çok aşamalı (multistage) yapıyı nasıl kullanıyorsunuz?
sobes.tech yapay zeka
AI'dan gelen yanıt
Çok aşamalı derleme, Dockerfile'da birkaç aşama (layers) kullanmaya olanak tanır; burada her aşama kendi görevini yerine getirir. Bir aşamanın sonucu (örneğin, derlenmiş bir artefakt) bir sonraki aşamaya aktarılır, ancak önceki aşamaların ara katmanları nihai imaja dahil edilmez.
Go uygulaması derlemek için kullanım örneği:
# Derleme aşaması
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Nihai aşama
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Avantajlar:
- İmaj boyutunun küçültülmesi: Nihai imajda yalnızca derlenmiş uygulama ve gerekli bağımlılıklar bulunur, derleme araçları, kaynak kod veya ara dosyalar dahil değildir.
- İşlevlerin ayrılması: Derleme/geliştirme mantığı, dağıtım mantığından ayrılır.
- Güvenliğin artırılması: Gereksiz araçlar ve kütüphaneler nihai imajdan çıkarılarak saldırı yüzeyi azaltılır.
- Derleme hızlandırması: Aşamalar arasındaki önbellekleme, tekrar derlemeleri hızlandırabilir.
Örneğin, sağlanan Dockerfile'da, ilk katman builder, Go uygulamasını derlemek için kullanılır. İkinci katman, FROM alpine:latest ile başlar ve yalnızca ilk katmandan derlenmiş uygulamayı (COPY --from=builder /app/myapp /app/) temiz bir temel imaja kopyalar. Sonuç olarak, nihai imaj yalnızca çalıştırılabilir dosyayı ve temel işletim sistemini içerir, Go derleyicisi ve kaynak kodu olmadan.
Bu, geleneksel yaklaşıma kıyasla imaj boyutunu önemli ölçüde azaltır; çünkü derleme ve çalışma tek bir konteynerde gerçekleşir.