CodeBlanks Logo Icon CodeBlanks

Docker ve dağıtım

  • Go kursu
  • İleri seviye
  • Ders 46/68
  • 6 dk

Dockerfile ve multi-stage build eklersin.

Docker ve dağıtım

Servis çok aşamalı bir Docker imajıyla paketlenir: ilk aşama derler, ikinci aşama yalnızca ikiliyi taşır.

FROM golang:1.23 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app ./cmd/server

FROM gcr.io/distroless/static
COPY --from=build /app /app
EXPOSE 8080
ENTRYPOINT ["/app"]

Sonuç birkaç MB'lık, kabuk içermeyen güvenli bir imajdır.

Ayarlar ve sağlık kontrolü

Konteyner içindeki servis ayarlarını ortam değişkenlerinden okur ve orkestratörün (Kubernetes, Docker) durumunu denetlemesi için bir sağlık uç noktası sunar:

port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("ok"))
})

Ayrıca SIGTERM geldiğinde srv.Shutdown(ctx) ile açık istekleri bitirip kapanmak (graceful shutdown) iyi bir alışkanlıktır.

Uygulama Port ayarı

port(env func(string) string) string fonksiyonu yaz: env("PORT") boşsa "8080" döndürsün. os.Getenv yerine sahte bir fonksiyonla iki durumu dene: boş ortam ve "9000" veren ortam. İki sonucu tek satırda yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func port(env func(string) string) string {
    if p := env("PORT"); p != "" {
        return p
    }
    return "8080"
}

func main() {
    bos := func(string) string { return "" }
    dolu := func(string) string { return "9000" }
    fmt.Println(port(bos), port(dolu))
}

Beklenen çıktı

8080 9000

Soru ve cevaplar

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

1 <code>go.mod</code> ve <code>go.sum</code> neden kaynak koddan önce kopyalanır?

  • Docker bunu zorunlu tuttuğu için
  • İmaj küçülsün diye
  • Testleri çalıştırmak için
  • Bağımlılık katmanı önbellekte kalsın, kod değişince yeniden indirilmesin diye Doğru cevap

Açıklama: Docker katmanları önbelleğe alır; go.mod değişmedikçe go mod download katmanı yeniden çalışmaz.

2 Önceki aşamadan kopyala

Soru
FROM gcr.io/distroless/static
COPY ____ /app /app
Cevap
FROM gcr.io/distroless/static
COPY --from=build /app /app

Açıklama: COPY --from=build, adı build olan aşamanın dosya sisteminden kopyalar.

3 Dağıtım parçaları

Kavram Anlamı
AS build Derleme aşaması
distroless Kabuksuz küçük taban
PORT Ortamdan ayar
/healthz Sağlık kontrolü

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