Docker-Go 交叉编译运行Go程序

最近在学习docker和kubernetes,无奈本机搭了一个minikube无论如何无法启容器,k8s的日志就只告诉说没起来我在重启,剩下什么原因也不说,于是决定先在本地docker启动一下看看。

原本的后端应用上线是我写好之后由我的boss统一上线的,所以Dockerfile也不是我写的,当然线上能跑,本地就肯定能跑啦,于是直接docker build,docker run,然后就出现问题了

./main: line 1: syntax error: unexpected “(”

随便搜了一下,发现基本上出现这个问题是因为运行程序的内核不同,然后仔细研究了一下Dockerfile,发现使用的是alpine的镜像,这个镜像的特点就是非常小,只有几兆,而且对比了一下公司的Dockerfile和golang官方alpine镜像的Dockerfile,发现我的Dockerfile里并没有集成go语言环境,而是直接将编译好的程序拷贝到镜像中,那么问题其实就可以确定了,我本地编译的基于Mac的go程序,即基于darwin内核的go程序,而alpine是基于Linux的内核的,自然无法运行。

知道了问题解决方法就很好办了,如果使用liteIDE的同学更是省事,直接删掉原本编译好的程序,选择cross-linux64环境编译就好(不用去改现有的darwin环境)

就算不是使用的LiteIDE,那也可以使用如下语句打包:

cd $GOPATH
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash

以上两步是为了生成linux平台所需要的工具和环境,只需要运行一次即可,如果使用liteIDE的话在切换环境的同时就会自动帮你准备好这些的
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

再次运行docker,成功启动容器!

发表评论

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