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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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
FROM golang:1.23 ____ builder
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 |