2022-07-17 Docker 基于 scratch 镜像部署 Go 项目
昨晚研究了下 Go 语言项目在 Docker 的 scratch 镜像中部署的方式,结果在 centos7 下编译的项目无论如何都无法运行起来,经过一番查询之后,发现是没有打包 lib 的缘故,无法在空镜像(scratch 镜像)运行, 所以只要指定环境变量后打包 lib 即可。
即:
1 | # Linux 下设置环境变量 |
更具体的解释如下:
当 CGO_ENABLED=1,进行编译时,会将文件中引用 libc 的库(比如常用的 net 包),以动态链接的方式生成目标文件。
当 CGO_ENABLED=0,进行编译时,则会把在目标文件中未定义的符号(外部函数)一起链接到可执行文件中。
如果在有操作系统的环境下,可以设置 CGO_ENABLED=1
,这样可以利用操作系统本身的 lib,减少程序的体积。
但在 scratch 镜像这样的空镜像中,连操作系统都没有的环境中,则需要设置 CGO_ENABLED=0
,将引用的 lib 编译到程序中,这样才能运行。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/f6daed68.html
版权声明:转载请注明出处!