在CentOS上打包前,需先安装Golang并设置环境变量。可从官网下载二进制文件(如go1.23.0.linux-amd64.tar.gz
),解压至/usr/local
目录,然后在~/.bashrc
(或~/.bash_profile
)中添加以下配置:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
运行source ~/.bashrc
使配置生效,验证go version
确认安装成功。
为避免依赖CentOS系统的外部库(如glibc
),需使用静态编译。关键参数组合:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-s -w -extldflags='-static'" -o myapp main.go
CGO_ENABLED=0
:禁用CGO(避免动态链接);-ldflags="-s -w"
:去除符号表和调试信息,减小文件体积(约30%~50%);-extldflags='-static'
:强制静态链接,生成完全独立的二进制文件。若本地环境非CentOS(如Mac/Windows),可通过设置GOOS
和GOARCH
交叉编译:
GOOS=linux GOARCH=amd64 go build -o myapp-linux-amd64 main.go
GOOS=linux
:目标系统为Linux(CentOS基于Linux);GOARCH=amd64
:目标架构为64位(若CentOS为ARM架构,需改为arm
)。通过Go Modules管理依赖,避免手动下载和版本冲突:
go mod init myapp # 初始化模块(生成go.mod文件)
go mod tidy # 自动整理依赖(下载缺失依赖、移除未使用依赖)
打包时,Go会自动读取go.mod
中的依赖,无需额外操作。
使用upx
工具进一步压缩静态编译后的二进制文件(需提前安装:yum install upx
):
upx --best --lzma myapp # 使用最高压缩率(--best)和LZMA算法(--lzma)
压缩后体积可再减少50%~70%,但需注意:部分安全软件可能误报压缩文件。
通过Docker打包应用,避免因CentOS服务器环境差异导致的问题。示例Dockerfile
:
FROM golang:1.23-alpine AS build # 使用轻量级Alpine基础镜像
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/myapp main.go
FROM alpine:latest # 使用更小的Alpine作为运行时镜像
WORKDIR /app
COPY --from=build /app/myapp . # 复制编译好的二进制文件
CMD ["/app/myapp"] # 直接运行二进制文件
构建并运行:
docker build -t myapp . # 构建镜像
docker run -p 8080:8080 myapp # 运行容器(映射端口)
优势:镜像体积小、环境一致、部署便捷。
go clean -cache
清除构建缓存,减少后续构建时间;-p
参数指定并行任务数(如go build -p 4
),充分利用多核CPU;GOGC=20
(默认100),降低GC频率,提升编译速度;若需让应用随系统启动,可使用systemd
创建服务单元文件:
sudo vi /etc/systemd/system/myservice.service
写入以下内容(替换路径和用户):
[Unit]
Description=My Go Application
After=network.target
[Service]
User=myuser
Group=myuser
ExecStart=/path/to/myapp
Restart=always
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl start myservice
sudo systemctl enable myservice # 开机自启动
通过systemctl status myservice
查看服务状态。
若需将应用打包为RPM格式(便于CentOS yum安装),需创建SPEC文件:
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
cp myapp ~/rpmbuild/SOURCES/
vi ~/rpmbuild/SPECS/myapp.spec
SPEC文件示例:
Name: myapp
Version: 1.0
Release: 1%{?dist}
Summary: My Go Application
License: MIT
URL: http://example.com
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 %{buildroot}
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/usr/bin
cp %{buildroot}/usr/bin/myapp %{buildroot}/usr/bin/
%files
/usr/bin/myapp
%changelog
* Mon Jan 01 2023 Your Name <your.email@example.com> - 1.0-1
- Initial package
构建RPM包:
rpmbuild -ba ~/rpmbuild/SPECS/myapp.spec
生成的RPM包位于~/rpmbuild/RPMS/x86_64/
目录,可通过yum install
安装。