CodeBlanks Logo Icon CodeBlanks

Multi-stage build

  • Go kursu
  • İleri seviye
  • Ders 48/68
  • 4 dk

Multi-stage build ile küçük imaj üretmeyi öğrenirsin.

Multi-stage build

Çok aşamalı derlemede her FROM yeni bir aşama başlatır. Derleme aşaması büyük olabilir; son aşama yalnızca gerekenleri alır:

FROM golang:1.23 AS builder
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .

FROM alpine:3.20
COPY --from=builder /out/app /usr/local/bin/app
CMD ["app"]

İmaj ~800 MB'tan ~15 MB'a iner.

Önbelleği akıllı kullan

Bağımlılıkları ayrı katmanda indirmek tekrar eden derlemeleri hızlandırır:

COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o /out/app .

BuildKit ile RUN --mount=type=cache,target=/root/.cache/go-build derleme önbelleğini de korur.

Uygulama Sürüm bilgisi

Derlemede -ldflags "-X main.version=1.2.0" ile değer verilecek var version = "dev" değişkenini tanımla ve fmt.Println("sürüm:", version) yazdır. (Bayraksız çalışınca dev görünür.)

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

var version = "dev"

func main() {
    fmt.Println("sürüm:", version)
}

Beklenen çıktı

sürüm: dev

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>CGO_ENABLED=0</code> burada neden önemlidir?

  • GC'yi kapatır
  • İkili libc'ye bağlanmaz, her tabanda çalışır Doğru cevap
  • Derleme hızlanır
  • Testleri kapatır

Açıklama: cgo açıkken ikili sistemdeki C kütüphanesine bağlanabilir; alpine veya scratch tabanda bu kütüphane farklı ya da yok olabilir.

2 Aşamaya ad ver

Soru
FROM golang:1.23 ____ builder
Cevap
FROM golang:1.23 AS builder

Açıklama: AS ile aşamaya ad verilir; sonra COPY --from=builder ile ona başvurulur.

3 Aşamalar

Kavram Anlamı
builder Derler
final Yalnızca ikili
COPY --from Aşamalar arası kopya
go mod download Önbelleklenen katman

İleri seviye bölümündeki tüm dersler