在 Ubuntu(Linux)上用 Go 打包“难”,通常不是 Go 本身难,而是环境、依赖和目标系统差异带来的坑。下面按常见原因拆解说明,并给出对应解法。
Go 的优势:
go build -o app main.go
✅ 在同架构、同系统下非常简单。
如果代码或依赖用了:
sqliteopensslzlibGo 会启用 CGO,结果:
glibc、libc 等系统库./app: error while loading shared libraries
✅ 禁用 CGO(如果可行):
CGO_ENABLED=0 go build
❌ 如果必须 CGO:
Ubuntu 20.04 → 18.04 可能跑不了:
FROM ubuntu:18.04
Go 支持交叉编译,但:
GOOS=windows GOARCH=amd64 go build
✅ 纯 Go:没问题
❌ 用 CGO:基本失败
Ubuntu 常见部署方式:
但很多人只生成二进制,不考虑:
go mod 没用好✅ 建议:
go mod tidy
go build
FROM golang:1.22
WORKDIR /app
COPY . .
RUN go build -o app
CMD ["./app"]
好处:
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
go build -o app
适合:
Go 在 Ubuntu 打包难,不是 Go 难,而是“系统依赖 + 环境不一致 + CGO”难。
如果你能说清楚:
我可以直接给你可复制的打包命令或 Dockerfile。