Ö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.0Kapanış 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
package main
import (
"context"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
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ı
FROM gcr.io/distroless/static
COPY --from=builder /out/app /app
____ nonroot
ENTRYPOINT ["/app"]
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 |