Golang 编译与 Docker alpine

问题及排查

使用 alpine 作为基础镜像,做了一个 Golang 程序的 Docker 镜像

在执行时提示:

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

于是进入该容器,确认下 Golang 程序时存在的

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 代码
  • 尽可能不要使用额外的编译选项!

你可能感兴趣的:(Golang 编译与 Docker alpine)