Cách tối ưu nhất là dùng multi-stage build: stage đầu tiên sử dụng image golang:1.22-alpine để compile source thành binary, stage thứ hai chỉ dùng scratch (image rỗng hoàn toàn) hoặc gcr.io/distroless/static rồi copy binary vào, cho ra final image chỉ 5-15MB thay vì hơn 1GB của golang base image.
- Để binary chạy được trên scratch image, cần set
CGO_ENABLED=0khi build để tạo static binary không phụ thuộc vào thư viện C bên ngoài. - Nên tách layer
COPY go.mod go.sumvàRUN go mod downloadriêng trước khi copy source code, để Docker cache lại dependency layer và chỉ rebuild khi dependency thay đổi, giúp tăng tốc build đáng kể.