Go语言CentOS打包的详细指南
小樊
44
2025-12-17 18:34:11
Go 语言在 CentOS 打包详细指南
一 环境准备与安装
安装 Go(两种常用方式,二选一)
使用包管理器安装:sudo yum install -y golang
手动安装二进制包(示例为 1.23.0 ,可按需替换版本):
wget https://dl.google.com/go/go1.23.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
配置环境变量(写入 ~/.bashrc 或 /etc/profile)
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
使配置生效:source ~/.bashrc 或 source /etc/profile
验证安装:go version 应输出版本号(如 go1.23.0 )
初始化项目与依赖
go mod init example.com/myapp
go mod tidy
二 本地编译与多架构交叉编译
本机编译(目标与构建机同为 Linux amd64 )
go build -o myapp main.go
交叉编译到 Linux(示例为 amd64 )
GOOS=linux GOARCH=amd64 go build -o myapp-linux-amd64 main.go
常用交叉编译目标
Linux amd64:GOOS=linux GOARCH=amd64
Windows amd64:GOOS=windows GOARCH=amd64(生成 .exe)
Linux arm64:GOOS=linux GOARCH=arm64
多架构一键脚本示例(bash)
for arch in amd64 arm64; do
GOOS=linux GOARCH=$arch go build -o myapp-linux-$arch main.go
done
说明
若项目使用 CGO (调用 C 库),跨平台/静态编译会更复杂;纯 Go 项目按上述方式即可稳定构建。
三 生成可分发包 RPM 与压缩归档
生成压缩归档(便于拷贝与备份)
打包:tar -czvf myapp.tar.gz myapp config.yaml
解压与运行:
tar -xzvf myapp.tar.gz
chmod +x ./myapp
./myapp
构建 RPM 包(推荐用于 CentOS 标准化分发)
安装工具:sudo yum install -y rpm-build
目录准备:mkdir -p $HOME/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
准备源码包(示例):tar -czvf $HOME/rpmbuild/SOURCES/myapp-1.0.tar.gz myapp config.yaml
编写 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 description.
%prep
%setup -q
%build
go build -o %{buildroot}/usr/bin/myapp
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/usr/bin
install -m 0755 myapp %{buildroot}/usr/bin/myapp
%files
/usr/bin/myapp
%changelog
构建:rpmbuild -ba $HOME/rpmbuild/SPECS/myapp.spec
产物位置:$HOME/rpmbuild/RPMS/x86_64/myapp-1.0-1.el*.x86_64.rpm。
四 Docker 多阶段构建与镜像打包
多阶段构建(减小镜像体积,适合部署)
Dockerfile 示例:
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 -ldflags “-s -w” -o /bin/myapp ./cmd/myapp
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=build /bin/myapp /app/myapp
EXPOSE 8080
CMD [“./myapp”]
构建与运行
docker build -t myapp:1.0 .
docker run --rm -p 8080:8080 myapp:1.0
说明
使用 CGO_ENABLED=0 生成静态二进制,避免运行时依赖 glibc;多阶段构建仅将可执行文件打入最终镜像,镜像更轻量。
五 体积优化与常见问题
减小二进制体积
去除符号与调试信息:go build -ldflags “-s -w” -o myapp
进一步压缩(可选):upx --best myapp(需安装 UPX)
静态编译(提升可移植性)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o myapp main.go
提升构建速度
并行构建:go build -p “$(nproc)”
调整 GC:export GOGC=20
使用更快的存储与 CPU、清理缓存:go clean -cache
常见问题排查
运行报 “No such file or directory”:多半是动态链接依赖问题,优先尝试 CGO_ENABLED=0 静态编译
权限问题:部署后执行 chmod +x ./myapp
跨平台构建失败:确认未使用 CGO 或为目标平台准备交叉编译环境
RPM 安装后找不到命令:检查 SPEC 中 %files 是否包含 /usr/bin/myapp 且权限为 0755 。