CGO_ENABLE=0 และ Static Binary ใน Go

--

FROM golang:1.9RUN mkdir -p /go/src
WORKDIR /go/src/github.com/purplebooth/example
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
FROM scratch
COPY --from=0 /go/src /main
CMD ["/main"]

ในกรณีที่เราต้องการ docker image ให้มีขนาดเล็ก เรามักทำ multi-stage build ดังตัวอย่างโค๊ดข้างบน และให้ image scratch ทำหน้าที่ execute binary file ซึ่ง sizing จะมีขนาดเล็กมาก เมื่อ deploy ขึ้น docker registry

จะสังเกตุว่ามีคำสั่ง CGO_ENABLE=0 มัน คือ การบอกว่าผลลัพธ์ที่เราต้องการ คือ STATIC BINARY แล้วมัน คืออะไรกันหล่ะ ??!!

การระบุ CGO_ENABLE=0 คือ?

เพื่อไม่ให้เกิดการ dynamic linking กับ C System Library หรือ Library ที่เขียน หรือ Compile ด้วย ภาษา C และผลลัพธ์ของการ build นั้น จะได้ execuable file ที่สามารถรันบน platform scratch ได้

--

--

Teerapong Singthong 👨🏻‍💻

Engineering Manager, ex-Solution Engineering Lead at LINE | Tech | Team Building | System Design | Architecture | SWE | Large Scaling System