CodeBlanks Logo Icon CodeBlanks

Özet - Docker

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

Multi-stage ve scratch'ı birleştirerek minimal imaj yazarsın.

Docker özeti

İyi bir Go imajının tarifi: çok aşamalı derleme, go.mod'u önce kopyalayıp önbelleği koruma, CGO_ENABLED=0 ile statik ikili, scratch veya distroless taban, ARG + ldflags ile sürüm bilgisi, LABEL ile üst veri ve Compose ile yerel geliştirme ortamı.

docker build --build-arg VERSION=1.0.0 -t app:1.0.0 .
docker run -p 8080:8080 app:1.0.0

Kapanış sinyali

docker stop sürece SIGTERM gönderir ve 10 saniye sonra SIGKILL ile öldürür. Go servisi bu sinyali yakalayıp açık istekleri bitirmelidir:

ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, os.Interrupt)
defer stop()
go srv.ListenAndServe()
<-ctx.Done()
srv.Shutdown(context.Background())

Ayrıca exec biçimi (ENTRYPOINT ["/app"]) kullanılmalı; kabuk biçiminde sinyal programa ulaşmayabilir.

Uygulama Sinyalle kapanış

ctx, cancel := context.WithCancel(context.Background()) oluştur ve sinyali taklit etmek için bir goroutine'de cancel() çağır. <-ctx.Done() ile bekle, ardından fmt.Println("kapanıyor") yazdır.

Başlangıç kodu

main.go
package main

import (
    "context"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "context"
    "fmt"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go cancel()
    <-ctx.Done()
    fmt.Println("kapanıyor")
}

Beklenen çıktı

kapanıyor

Soru ve cevaplar

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

1 Konteyneri root olmayan kullanıcıyla çalıştırmak için hangi talimat kullanılır?

  • EXPOSE
  • USER Doğru cevap
  • RUN
  • ARG

Açıklama: USER sonraki komutları ve konteyner sürecini belirtilen kullanıcıyla çalıştırır; distroless'te "nonroot" kullanıcısı hazırdır.

2 Root olmayan kullanıcı

Soru
FROM gcr.io/distroless/static
COPY --from=builder /out/app /app
____ nonroot
ENTRYPOINT ["/app"]
Cevap
FROM gcr.io/distroless/static
COPY --from=builder /out/app /app
USER nonroot
ENTRYPOINT ["/app"]

Açıklama: USER nonroot, konteynerin root yetkisiyle çalışmasını engeller.

3 Grubun özeti

Kavram Anlamı
Multi-stage Küçük imaj
CGO_ENABLED=0 Statik ikili
SIGTERM Nazik kapanış
USER nonroot Daha güvenli

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