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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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
FROM gcr.io/distroless/static
COPY ____ /app /app
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ü |