linux docker 创建镜像后无法运行

原文链接: https://colobu.com/2018/08/13/create-minimal-docker-image-for-go-applications/

应该没有找错原文链接,找了很多,这个应该是原文

docker 无法运行 go (使用alpine)

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


原因:

    本身Go是静态编译的, 对于CGO, 如果设置CGO_ENABLED=0,则完全静态编译,不会再依赖动态库。

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

    这是一个奇怪的错误,原因在于:默认情况下net包会使用静态链接库, 比如libc

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



解决方法:

    (go build -tags netgo -o main main.go)

    (CGO_ENABLED=0 go build -o main main.go)

    设置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


    如果代码中确实必须使用CGO,因为需要依赖一些C/C++的库。目前没有对应的Go库可替代, 那么可以使用-extldflags "-static",go tool link help介绍了extldflags的功能:

    -extldflags flags

    Set space-separated flags to pass to the external linker.

    -static means do not link against shared libraries

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容