Episode ini membawa aplikasi Go ke production: build static binary dengan CGO_ENABLED=0, multi-stage Dockerfile yang efisien, image distroless minimal, serta deployment ke Kubernetes, Cloud Run, dan platform serverless.

Di episode 1 kalian mendengar bahwa Go menghasilkan binary statis. Episode 16 adalah saatnya menuai keuntungan itu: aplikasi Go adalah salah satu kandidat terbaik untuk container karena image-nya bisa sangat kecil, aman, dan cepat dideploy.
Episode 16 membawa aplikasi Go ke cloud: membangun binary statis, menyusun multi-stage Dockerfile yang efisien, memakai image distroless yang minimal, dan mendeploy ke Kubernetes, Cloud Run, serta platform serverless. Di akhir episode, aplikasi kalian berjalan di production dengan footprint sekecil mungkin.
CGO memungkinkan Go memanggil kode C, tetapi membuat binary bergantung pada pustaka C di runtime. Menonaktifkannya dengan CGO_ENABLED=0 menghasilkan binary murni yang berjalan di container sekecil apa pun — termasuk distroless dan scratch yang tanpa shell.
CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app .Flag -ldflags="-s -w" menghilangkan tabel simbol dan informasi debug, mengecilkan ukuran binary. Untuk mengecek hasilnya, file app harus menunjukkan statically linked.
Go mendukung cross-compilation tanpa toolchain tambahan. GOOS dan GOARCH menentukan target: GOOS=linux GOARCH=arm64 untuk ARM, GOOS=darwin untuk macOS. Inilah fleksibilitas yang membuat Go unggul di ekosistem multi-platform.
Dockerfile multi-stage memisahkan environment build dari runtime. Stage pertama memakai image Go lengkap untuk kompilasi; stage kedua hanya menyalin binary — tanpa source code dan tanpa toolchain.
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app .
FROM gcr.io/distroless/static-debian12
COPY --from=builder /app/app /app/app
ENTRYPOINT ["/app/app"]Stage builder mengunduh dependency sekali lewat go mod download, memanfaatkan cache layer. Image distroless hanya berisi binary dan runtime minimal — tanpa shell, tanpa package manager, permukaan serangan yang sangat kecil.
Image Go yang baik berukuran puluhan megabyte, jauh lebih kecil dibanding image berbasis Python atau Node. Keuntungannya: download lebih cepat saat deployment, penyimpanan registry lebih hemat, dan startup container lebih cepat — semuanya krusial untuk scaling cepat.
Aplikasi Go dideploy sebagai Deployment dengan probe kesehatan yang sudah kita bangun di episode 15:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-go
spec:
replicas: 3
selector:
matchLabels:
app: api-go
template:
metadata:
labels:
app: api-go
spec:
containers:
- name: api-go
image: registry.example.com/api-go:1.0.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /readyz
port: 8080Terapkan dengan kubectl apply -f deployment.yaml, lalu ekspos lewat Service dan Ingress. HorizontalPodAutoscaler bisa menambah replika berdasarkan metrik CPU atau request per detik.
Selalu tag image dengan versi yang unik — jangan latest di production karena sulit di-rollback. imagePullPolicy: IfNotPresent mempercepat deployment ulang, sedangkan tag yang berubah memicu pull image baru.
Cloud Run menjalankan container tanpa perlu mengelola cluster. Image Go statis sangat cocok karena cold start yang singkat. Deploy dengan perintah:
gcloud run deploy api-go \
--image registry.example.com/api-go:1.0.0 \
--region asia-southeast1 \
--allow-unauthenticatedCloud Run menskalakan ke nol saat tidak ada traffic, jadi biaya hanya muncul ketika layanan dipakai. Port yang didengarkan aplikasi dibaca dari environment PORT.
AWS Lambda mendukung Go melalui custom runtime atau container image, begitu pula Google Cloud Functions dan Azure Functions. Binary statis Go bisa dibungkus sebagai image container fungsi tanpa runtime tambahan, sehingga memory footprint-nya jauh lebih kecil dibanding bahasa lain.
Beberapa praktik yang menjaga container Go tetap sehat:
USER nonroot atau gunakan image distroless yang tidak punya user root default.requests dan limits CPU serta memori.Praktik ini memastikan image yang sama bisa dideploy ke environment mana pun tanpa perubahan.
Episode 16 membawa aplikasi Go ke production: build static binary dengan CGO_ENABLED=0 dan -ldflags, multi-stage Dockerfile dengan image distroless minimal, deployment ke Kubernetes dengan probe, serta deploy ke Cloud Run dan platform serverless.
Inti yang harus dibawa pulang:
CGO_ENABLED=0 menghasilkan binary statis tanpa dependensi C.-ldflags="-s -w" mengecilkan ukuran binary.Di episode 17 selanjutnya kita akan membahas CI/CD, release, dan dependency management — pipeline build dan test otomatis dengan GitHub Actions, menjaga dependency aman dengan go mod verify dan govulncheck, serta release workflow dengan versioning, semantic imports, dan distribusi binary.