Docker 基于 scratch 镜像部署 Go 项目

昨晚研究了下 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 编译到程序中,这样才能运行。