解决go项目构建后不能夸Linux平台的问题

发布于:2025-04-22 ⋅ 阅读:(36) ⋅ 点赞:(0)

有4个go语言项目需要做CI/CD,最后发布到K8S集群

在这里插入图片描述

先看看gitlab-ci.yml的配置如下。image: 192.168.12.219:80/willlink/golang:ubuntu是一个从docker官方拉取的go1.23镜像,os版本是debian12。

stages:
  - build-deploy

build-deploy:
  stage: build-deploy
  image: 192.168.12.219:80/willlink/golang:ubuntu
  tags:
    - runner
  only:
    - develop
  before_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
  1. export CGO_ENABLED=0
    • 禁用CGO(C语言调用功能)
    • 当设为0时,编译的二进制文件将是静态链接的,不依赖任何外部C库,这是实现跨平台的关键
  2. export GOOS=linux
    • 设置目标操作系统为Linux
    • GOOS(Go Operating System)指定编译后的程序运行的操作系统
    • 其他常见值包括:windowsdarwin(macOS)、freebsd
  3. export GOARCH=amd64
    • 设置目标CPU架构为amd64(即64位x86架构)

    • GOARCH(Go Architecture)指定编译后的程序运行的CPU架构

    • 其他常见值包括:386(32位x86)、armarm64

    • GOARCH(Go Architecture)指定编译后的程序运行的CPU架构

    • 其他常见值包括:386(32位x86)、armarm64

最后也是解决了


网站公告

今日签到

点亮在社区的每一天
去签到