เรียนรู้วิธี compile โปรแกรม Go ให้เป็น binary ที่สามารถรันได้ทุกที่ โดยไม่ต้องพึ่งพา shared library ภายนอก
บทนำ
หนึ่งในจุดแข็งของภาษา Go คือการ build โปรแกรมให้เป็น Static Binary ได้อย่างง่ายดาย ซึ่งหมายถึง executable ไฟล์เดียวที่มีทุกอย่างในตัว ไม่ต้องพึ่งพาไลบรารีจากระบบปลายทาง เหมาะสำหรับการ deploy ไปยัง container, serverless หรือแม้แต่ embedded system
ในบทความนี้ เราจะพาคุณไปเรียนรู้ตั้งแต่พื้นฐาน การตั้งค่าสภาพแวดล้อม การใช้ flag ต่าง ๆ และเทคนิคเพื่อลดขนาด binary ให้เล็กที่สุดเท่าที่จะเป็นไปได้
Static Binary คืออะไร?
Static binary คือ executable ที่ link ไลบรารีทั้งหมดเข้าไปในตัว binary เอง ทำให้ไม่ต้องพึ่ง shared library ภายนอก

ข้อดีคือ:
- รันได้ทุกเครื่องโดยไม่ต้องติดตั้ง dependency
- เหมาะกับ container ขนาดเล็ก เช่น
scratch
หรือdistroless
- ลดความเสี่ยงจาก dependency ที่เปลี่ยนแปลง
ขั้นตอนการ Build Static Binary ด้วย Go
1. เขียนโปรแกรม Go แบบธรรมดา
package main import "fmt" func main() { fmt.Println("Hello Static Binary!") }
2. ใช้คำสั่ง build พร้อม environment
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o app
อธิบาย:
CGO_ENABLED=0
ปิดการใช้ C library ทั้งหมด เพื่อบังคับ static link-ldflags="-s -w"
ตัด symbol table และ debug info เพื่อลดขนาด
3. ตรวจสอบขนาดไฟล์
ls -lh app file app
ผลลัพธ์:
app: ELF 64-bit LSB executable, statically linked, not stripped
การลดขนาด Binary ให้เล็กที่สุด
แม้ Go จะ compile ได้ static อยู่แล้ว แต่เราสามารถลดขนาดเพิ่มเติมได้:
1. ใช้ upx
เพื่อบีบอัด
upx -9 app
2. ใช้ lib เช่น musl
(ผ่าน Docker)
FROM alpine:latest AS builder RUN apk --no-cache add go musl-dev WORKDIR /app COPY . . ENV CGO_ENABLED=0 RUN go build -ldflags="-s -w" -o app FROM scratch COPY --from=builder /app/app /app ENTRYPOINT ["/app"]
กรณีต้องใช้ CGO และยังอยาก static
หากใช้ package ที่ใช้ CGO เช่น sqlite
, net
บางกรณี เราต้องทำ static link ด้วย libc แบบพิเศษ เช่น:
CGO_ENABLED=1 CC=musl-gcc go build -ldflags="-s -w"
หรือใช้ Docker base image เช่น frolvlad/alpine-glibc
เพื่อ build image ที่เล็ก
ตรวจสอบว่า binary เป็น static หรือไม่
ldd ./app
ถ้า output เป็น:
not a dynamic executable
แสดงว่า static binary แล้ว
การใช้งานร่วมกับ Docker image แบบ Minimal
FROM scratch COPY ./app /app ENTRYPOINT ["/app"]
สามารถ build docker image ได้เล็กมาก (เช่น 1.5MB
) และ deploy เร็วขึ้น

สรุป
การ Build Go ให้เป็น Static Binary เป็นจุดแข็งที่ทำให้ Go ได้รับความนิยมในสาย DevOps และ Cloud Native การใช้ static binary ทำให้การ deploy ง่าย ปลอดภัย และประหยัด resource
หากคุณกำลังเขียน CLI tools, microservice หรือ container ที่ต้องใช้ runtime ต่ำ แนะนำให้ใช้ static binary เป็นทางเลือกหลัก
คำค้น (SEO Keywords)
- Go Static Binary
- Go Build Executable
- CGO_ENABLED=0
- ลดขนาด Go Binary
- Build Go แบบ Static
- Cross compile Go
- Go Docker Scratch