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 代码
- 尽可能不要使用额外的编译选项!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 我和你之前距离
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 原生家庭之痛与超越