CentOS上Golang打包注意事项
在CentOS上打包前,需确保Go环境变量配置正确。首先安装Golang(可通过yum或官网下载二进制包),然后编辑~/.bashrc或~/.zshrc文件,添加以下内容:
export GOROOT=/usr/local/go(Go安装路径)、export GOPATH=$HOME/go(工作空间路径)、export PATH=$PATH:$GOROOT/bin:$GOPATH/bin。运行source ~/.bashrc使配置生效。若使用Go 1.11及以上版本,建议开启模块支持:export GO111MODULE=on,并设置代理加速依赖下载:export GOPROXY=https://goproxy.cn,direct。
CentOS上常需为其他平台(如Linux服务器)打包,需通过环境变量指定目标系统。例如,为Linux 64位系统编译:
GOOS=linux GOARCH=amd64 go build -o myapp。若目标系统为Windows,则改为:GOOS=windows GOARCH=amd64 go build -o myapp.exe。需确保GOOS和GOARCH与目标环境一致,避免“exec格式错误”。
为减少目标环境的依赖(如C库),建议使用静态编译。设置CGO_ENABLED=0禁用CGO,并添加优化参数:
CGO_ENABLED=0 go build -a -installsuffix cgo -ldflags '-s -w' -o myapp。其中,-a重新编译所有依赖,-installsuffix cgo隔离编译结果,-ldflags '-s -w'移除调试信息,减小文件体积(通常可减少30%~50%)。
Go Modules是Go 1.11+的官方依赖管理工具,可避免“依赖版本冲突”。在项目根目录初始化模块:go mod init <module-name>(如go mod init github.com/user/myapp),然后运行go mod tidy自动下载并整理依赖。确保go.mod和go.sum文件纳入版本控制,保证团队成员及部署环境的依赖一致。
FROM centos:6),在其中编译。libcurl、openssl等库,需安装对应开发包(如sudo yum install libcurl-devel openssl-devel)。打包完成后,需为可执行文件赋予执行权限:chmod +x myapp。若需后台运行,可使用nohup命令:nohup ./myapp > log.log 2>&1 &(输出重定向到日志文件,避免进程因终端关闭而终止)。对于需要开机自启动的服务,建议使用systemd创建服务文件(如/etc/systemd/system/myapp.service),通过systemctl start myapp管理。
upx工具进一步压缩(如upx --best myapp),通常可再减少50%~70%体积(需注意upx可能影响调试)。GOGC=20(调整垃圾回收频率)、GOMAXPROCS=$(nproc)(使用所有CPU核心)、GOBIN=$HOME/go/bin(指定二进制输出目录),加快编译过程。使用Docker可避免环境差异问题,推荐以Alpine Linux为基础镜像(体积小、安全性高)。示例Dockerfile:
FROM golang:1.18-alpine as build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp
FROM alpine:latest
WORKDIR /app
COPY --from=build /app/myapp .
EXPOSE 8080
CMD ["./myapp"]
运行docker build -t myapp .构建镜像,docker run -p 8080:8080 myapp启动容器,适用于快速部署到云服务器或容器平台。