在 CentOS 上打包 Go 应用的依赖可分为系统级依赖与 Go 模块依赖两类,按是否启用 CGO 区分。下面给出最小可用清单与常见可选组件。
系统级依赖清单
- 基础工具与构建链:安装 Development Tools(包含 gcc、g++、make、autoconf、automake 等)与 git、wget,用于获取代码与构建。
命令示例:sudo yum groupinstall -y “Development Tools”;sudo yum install -y git wget
- 常用运行库头文件与开发包:
- zlib zlib-devel(压缩/解压)
- openssl openssl-devel(TLS/SSL)
- pcre pcre-devel(正则,部分依赖如某些 HTTP 库会用到)
命令示例:sudo yum install -y zlib zlib-devel openssl openssl-devel pcre pcre-devel
- 说明:若你的应用不启用 CGO(常见做法),以上库并非 Go 编译的硬性要求;但安装它们可避免部分第三方库在构建或运行时因缺少头文件/链接库而报错。
Go 工具链与模块依赖
- Go 工具链:安装与配置 Go(建议从官网下载 linux-amd64 二进制包,解压至 /usr/local,并将 /usr/local/go/bin 加入 PATH)。
命令示例:wget https://golang.org/dl/go1.23.linux-amd64.tar.gz;sudo tar -C /usr/local -xzf go1.23.linux-amd64.tar.gz;echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bashrc;source ~/.bashrc
- 依赖管理:使用 Go Modules(go.mod/go.sum)。在项目根目录执行 go mod tidy 拉取与整理依赖,确保构建可复现。
按是否启用 CGO 的区分
- 纯 Go(推荐):设置 CGO_ENABLED=0 进行静态编译,生成不依赖系统 C 库的二进制,跨发行版更稳。
示例:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags “-s -w” -o myapp
- 启用 CGO:需安装 gcc 等 C 编译器,并将 CGO_ENABLED=1,必要时设置 CC;若目标库需要 OpenSSL 等系统库,需确保相应 -devel 包已安装。
示例:CGO_ENABLED=1 CC=gcc go build -o myapp。
可选工具与打包建议
- 减小体积与压缩:使用 -ldflags “-s -w” 去除符号与调试信息,配合 UPX 进一步压缩(需单独安装 upx)。
示例:go build -ldflags “-s -w” -o myapp;upx --best myapp
- 容器化构建:使用多阶段 Dockerfile,在构建阶段使用 golang:1.16 或更新版本镜像,设置 CGO_ENABLED=0 编译,产出静态二进制,运行时使用 alpine 或 distroless 基础镜像减小体积。
示例:
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/myapp /usr/local/bin/
CMD [“myapp”]
- 服务化部署:将二进制与配置一起打包(如 tar.gz),在目标机器用 systemd 管理服务(创建 /etc/systemd/system/your_app.service,配置 ExecStart、Restart、User、Environment 等)。