Dockerize Go: En Küçük Boyutlu Go Image'ı Oluşturma Teknikleri

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Top Poster Of Month
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18

1GB'lık İmaj mı, 10MB'lık İmaj mı?​

Go derlendiğinde tek bir çalıştırılabilir dosya (Binary) üretir. Bu yüzden Go uygulamalarını Docker'a koyarken Python veya Node.js gibi devasa çalışma zamanlarına (Runtime) ihtiyacımız yoktur.Standart yöntemle Docker image oluşturursanız boyut 800MB olabilir. Multi-stage Build ile bunu 10MB'a düşürebiliriz!

Multi-stage Dockerfile Örneği​

Kod:
[HEADING=2]1. AŞAMA: Derleme (Builder Stage)[/HEADING]
[HEADING=2]Golang yüklü büyük imajı kullanıyoruz[/HEADING]
FROM golang:1.21-alpine AS builder

WORKDIR /appCOPY . .

[HEADING=2]CGO_ENABLED=0 -> Statik binary üretir (dış kütüphane bağımlılığı olmaz)[/HEADING]
RUN go mod downloadRUN CGO_ENABLED=0 GOOS=linux go build -o main .

[HEADING=2]2. AŞAMA: Çalıştırma (Runner Stage)[/HEADING]
[HEADING=2]"scratch" -> Boş, içinde hiçbir şey (işletim sistemi bile) olmayan imaj[/HEADING]
[HEADING=2]Veya "gcr.io/distroless/static" kullanılabilir (daha güvenli)[/HEADING]
FROM scratch

WORKDIR /root/

[HEADING=2]Sadece derlenmiş dosyayı (binary) kopyalıyoruz[/HEADING]
COPY --from=builder /app/main .

[HEADING=2]Uygulamayı çalıştır[/HEADING]
CMD ["./main"]

Neden Scratch?​

FROM scratch dediğinizde, imajın içinde Linux kabuğu (bash/sh) bile yoktur. Bu, saldırı yüzeyini (Attack Surface) sıfıra indirir. Hacker içeri sızsa bile çalıştıracak ls komutu bulamaz.

Sonuç​

Go'nun en büyük avantajlarından biri budur: Mikroskobik boyutlarda, ultra güvenli ve hızlı Docker konteynerleri.
 
Geri
Üst