Golang|Golang 编译与 Docker alpine

问题及排查 使用 alpine 作为基础镜像,做了一个 Golang 程序的 Docker 镜像
在执行时提示:

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

于是进入该容器,确认下 Golang 程序时存在的
【Golang|Golang 编译与 Docker alpine】ldd 了下,发现这个程序(redis2go),不是静态编译
/ # ldd ./redis2go /lib64/ld-linux-x86-64.so.2 (0x7f7407d36000) libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f7407d36000) libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f7407d36000) Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by ./redis2go) Error relocating ./redis2go: __libc_free: symbol not found Error relocating ./redis2go: __libc_malloc: symbol not found Error relocating ./redis2go: __libc_realloc: symbol not found Error relocating ./redis2go: __libc_stack_end: symbol not found

这个与 Golang 官方称已经全部重写了 C 代码有出入
因此最大的可能是程序中使用 cgo ?
然而,只是个小工具,不存在 cgo 代码
于是仔细查看了下编译脚本:
go install -race ./tools/...

发现 -race 选项,把它去掉看看
然后就 OK 了…
结论 使用 alpine 做基础镜像,或是让 Golang 程序作为全静态编译的看待的
请不要:
  • 使用 cgo 代码
  • 尽可能不要使用额外的编译选项!

    推荐阅读