golang程序打包成容器镜像 ./app: not found错误

在golang程序打包成容器镜像过程中,出现了一个 ./app: not found错误,app是编译好的执行程序,文件是存在的,基础镜像用的是alpine镜像。想来应该是编译过程的问题,后来加了CGO_ENABLED=0成功解决此问题。

后来看到一篇相关文章,在此记录下

如果设置CGO_ENABLED=0,并且你的代码中使用了标准库的net包的话,有可能编译好的镜像无法运行,报sh: /app: not found的错误,尽管/app这个文件实际存在,并且如果讲基础镜像换为centos或者ubuntu的话就能执行。这是一个奇怪的错误,原因在于:

默认情况下net包会使用静态链接库, 比如libc

知道了原因,解决办法也很简单,就是完全静态链接或者在基础镜像中加入libc库。

下面是几种解决办法:

设置CGO_ENABLED=0
编译是使用纯go的net:go build -tags netgo -a -v
使用基础镜像加glibc(或等价库musl、uclibc), 比如 busybox:glibc、alpine +RUN apk add –no-cache libc6-compat、frolvlad/alpine-glibc

 

相关链接:

https://toutiao.io/posts/opk2hm

http://reborncodinglife.com/2018/04/29/how-to-create-dynamic-lib-in-golang/

http://reborncodinglife.com/2018/04/27/how-to-create-static-lib-in-golang/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据