building go binaries for small docker images

building docker images with go should be super easy - picking a minimal image (in my case I build from alpine), build the binary, ADD to the image, run…

the problem

your app is not starting, instead you see something like this

standard_init_linux.go:195: exec user process caused "no such file or directory"

cause: several modules are calling C code via cgo, and cgo depends on libc. Go found libc on the system it was build on, so it linked to it. But libc is missing on alpine…

the fix

build a really static linked binary!

CGO_ENABLED=0 go build -a -o main .
  • CGO_ENABLED=0 - disable cgo, this is the important part!
  • -a - rebuild all, including imported depdenencies

now, your app should start without a problem, even on a scratch image :)

Last posts