昨晚研究了下 Go 语言项目在 Docker 的 scratch 镜像中部署的方式,结果在 centos7 下编译的项目无论如何都无法运行起来,经过一番查询之后,发现是没有打包 lib 的缘故,无法在空镜像(scratch 镜像)运行, 所以只要指定环境变量后打包 lib 即可。
即:
# Linux 下设置环境变量
export CGO_ENABLED=0
go build main.go
更具体的解释如下:
当 CGO_ENABLED=1,进行编译时,会将文件中引用 libc 的库(比如常用的 net 包),以动态链接的方式生成目标文件。
当 CGO_ENABLED=0,进行编译时,则会把在目标文件中未定义的符号(外部函数)一起链接到可执行文件中。
如果在有操作系统的环境下,可以设置 CGO_ENABLED=1
,这样可以利用操作系统本身的 lib,减少程序的体积。
但在 scratch 镜像这样的空镜像中,连操作系统都没有的环境中,则需要设置 CGO_ENABLED=0
,将引用的 lib 编译到程序中,这样才能运行。
- 本文链接: https://wp.cmyr.ltd/archives/docker-based-on-scratch-image-deployment-go-project
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
欢迎关注我的其它发布渠道
发表回复
要发表评论,您必须先登录。