温馨提示×

Golang在CentOS打包流程详解

小樊
49
2026-01-08 05:16:51
栏目: 编程语言

一 环境准备与 Go 安装

  • 安装 Go(两种常用方式,二选一)
    • 使用包管理器安装:sudo yum install -y golang,安装后用 go version 验证。
    • 使用官方二进制包安装:下载对应版本(如 go1.23.x.linux-amd64.tar.gz),解压至 /usr/local,并配置环境变量(写入 /etc/profile~/.bashrc):
      • export GOROOT=/usr/local/go
      • export GOPATH=$HOME/go
      • export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
      • 执行 source /etc/profile 或 source ~/.bashrc 使配置生效。
  • 初始化项目与依赖
    • go mod init
    • go mod tidy 整理依赖。

二 本地编译与交叉编译

  • 基本编译
    • go build -o myapp main.go
  • 交叉编译为 Linux amd64(在 macOS/Windows 上也可生成 CentOS 可执行文件)
    • GOOS=linux GOARCH=amd64 go build -o myapp-linux-amd64 main.go
  • 常用构建优化
    • 减小体积:go build -ldflags “-s -w” -o myapp main.go
    • 完全静态链接(避免外部 C 库依赖,便于在极简镜像或不同发行版运行):CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o myapp main.go
  • 并行构建与缓存清理
    • go build -p $(nproc)
    • go clean -cache

三 打包为 RPM 分发(企业内部标准化)

  • 安装构建工具
    • sudo yum install -y rpm-build rpmdevtools mock
  • 准备构建目录
    • rpmdev-setuptree 生成 ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
  • 放置二进制与源码
    • 将可执行文件或源码包放入 ~/rpmbuild/SOURCES/(例如:cp myapp ~/rpmbuild/SOURCES/)
  • 编写 SPEC 示例(myapp.spec)
    • Name: myapp

    • Version: 1.0

    • Release: 1%{?dist}

    • Summary: My Go application

    • License: MIT

    • URL: http://example.com/myapp

    • Source0: %{name}-%{version}.tar.gz

    • BuildRequires: golang

    • Requires: golang

    • %description My Go application

    • %prep %setup -q

    • %build go build -o %{buildroot}/usr/bin/myapp

    • %install rm -rf %{buildroot} mkdir -p %{buildroot}/usr/bin install -m 0755 %{buildroot}/usr/bin/myapp %{buildroot}/usr/bin/myapp

    • %files /usr/bin/myapp

    • %changelog

  • 构建
    • 生成源码包:rpmbuild -bs SPECS/myapp.spec
    • 本地构建二进制 RPM:rpmbuild -ba SPECS/myapp.spec
    • 使用 mock 在隔离环境构建(推荐):mock -r centos-7-x86_64 --rebuild ~/rpmbuild/SRPMS/myapp-1.0-1.el7.src.rpm
  • 说明
    • CentOS 7/8 可配合 go-srpm-macros 简化 Go 项目的 RPM 构建流程(宏封装常用操作)。

四 Docker 多阶段构建与镜像优化

  • 多阶段构建示例(体积更小、可移植性更强)
    • FROM golang:1.23-alpine AS build
      • WORKDIR /src
      • RUN go mod download
      • RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o /bin/app ./cmd/app
    • FROM alpine:latest
      • RUN apk --no-cache add ca-certificates
      • WORKDIR /app
      • COPY --from=build /bin/app /app/app
      • CMD [“./app”]
  • 构建与运行
    • docker build -t myapp:1.0 .
    • docker run -d --name myapp -p 8080:8080 myapp:1.0

五 部署运行与常见问题

  • 上传与运行
    • scp myapp-linux-amd64 user@host:/opt/myapp
    • ssh user@host “chmod +x /opt/myapp && nohup /opt/myapp > app.log 2>&1 &”
  • 进程守护与平滑发布
    • 建议使用 systemd 管理:创建 /etc/systemd/system/myapp.service
      • [Unit]
        • Description=My Go App
        • After=network.target
      • [Service]
        • ExecStart=/opt/myapp
        • Restart=always
        • User=nobody
        • WorkingDirectory=/opt
      • [Install]
        • WantedBy=multi-user.target
    • 常用命令:
      • systemctl daemon-reload
      • systemctl enable --now myapp
      • systemctl restart myapp
  • 常见问题与排查
    • 动态链接导致缺依赖:优先使用 CGO_ENABLED=0 静态构建,避免目标系统缺少 glibc 等兼容库。
    • 体积过大:使用 -ldflags “-s -w” 移除符号与调试信息,必要时再用 UPX 压缩(upx --best app)。
    • 构建很慢:设置并行构建(go build -p $(nproc)),并在构建完成后执行 go clean -cache 清理缓存。

0