解决go项目构建后不能夸Linux平台的问题
有4个go语言项目需要做CI/CD,最后发布到K8S集群
先看看gitlab-ci.yml的配置如下。image: 192.168.12.219:80/willlink/golang:ubuntu是一个从docker官方拉取的go1.23镜像,os版本是debian12。
stages:- build-deploybuild-deploy:stage: build-deployimage: 192.168.12.219:80/willlink/golang:ubuntutags:- runneronly:- developbefore_script:- echo "CI/CD开始执行"- eval $(ssh-agent -s)- ssh-add <(echo "$STAGING_PRIVATE_KEY")- echo ${STAGING_PRIVATE_KEY}- echo "为容器配置ssh私钥成功!"script:- go build- ls -alh- docker build -t $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG .- docker login $HARBOR_URL -u $HARBOR_USERNAME -p $HARBOR_PASSWORD- docker push $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG- docker rmi -f $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG- echo "开始更新K8S应用"- ssh -o StrictHostKeyChecking=no root@192.168.12.211 "kubectl -n willlink-go get deploy &&kubectl set env deployment/cabinet-gateway FORCE_UPDATE_=$(date +%Y%m%d%H%M) -n willlink-go &&sleep 20 &&kubectl -n willlink-go get pods -o wide | grep 'cabinet-gateway' &&echo '已更新!退出shell!!!' &&exit"
构建完成后会生成对应的产物,也就是一个二进制命令cabinet_sinexcel_gateway
接下来会执行一个docker build的操作,先看看Dockerfile,这个alpine是在docker官方的alpine:3.20
FROM 192.168.12.219:80/lvwo/alpine:v1
COPY cabinet_sinexcel_gateway /
COPY conf.ini /
EXPOSE 27030
ENTRYPOINT ["/cabinet_sinexcel_gateway"]
这个容器运行的时候会报错cabinet_sinexcel_gateway位找到,但是我实际查看容器内是有这个命令的,也就是说构建的go二进制命令不能再alpine平台运行。
之前我的golang构建容器是golang:1.23-alpine-3.20是可以在alpine容器运行的,后面增加了go参数就解决了
script:- export CGO_ENABLED=0- export GOOS=linux- export GOARCH=amd64- go build- ls -alh- docker build -t $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG .- docker login $HARBOR_URL -u $HARBOR_USERNAME -p $HARBOR_PASSWORD- docker push $IMAGE_HARBOR_REPOSITORY/$PROJECT_IMAGE_NAME:$PROJECT_IMAGE_TAG
export CGO_ENABLED=0
- 禁用CGO(C语言调用功能)
- 当设为0时,编译的二进制文件将是静态链接的,不依赖任何外部C库,这是实现跨平台的关键
export GOOS=linux
- 设置目标操作系统为Linux
- GOOS(Go Operating System)指定编译后的程序运行的操作系统
- 其他常见值包括:
windows
、darwin
(macOS)、freebsd
等
export GOARCH=amd64
-
设置目标CPU架构为amd64(即64位x86架构)
-
GOARCH(Go Architecture)指定编译后的程序运行的CPU架构
-
其他常见值包括:
386
(32位x86)、arm
、arm64
等 -
GOARCH(Go Architecture)指定编译后的程序运行的CPU架构
-
其他常见值包括:
386
(32位x86)、arm
、arm64
等
-
最后也是解决了