Build Go ให้เป็น Executable แบบ Static Binary ขนาดเล็ก

Sharing is caring!

เรียนรู้วิธี 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

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *