在 Ubuntu 上使用 Golang 打包(编译)程序时,通常要注意下面几个方面,按「常见坑 → 推荐做法」来说:
如果你要 交叉编译 或 给其他系统用:
# 查看当前环境
go env GOOS GOARCH
# 示例:编译 Linux amd64
GOOS=linux GOARCH=amd64 go build -o app main.go
# 示例:编译 Windows
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
⚠️ 注意:
linux/amd64GOARCH=arm64Ubuntu 上 默认可能启用了 CGO
go env CGO_ENABLED
CGO_ENABLED=0 go build -o app main.go
✅ 优点:
必须开启 CGO:
CGO_ENABLED=1 go build -o app main.go
⚠️ 注意:
version 'GLIBC_2.34' not found如果用到 CGO:
sudo apt update
sudo apt install -y build-essential
验证:
gcc --version
编译完后检查依赖:
ldd app
如果看到:
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
说明依赖系统库(CGO 开启)
chmod +x app
-ldflags 减小体积go build -ldflags="-s -w" -o app main.go
可选配合:
upx app
(Ubuntu 安装:sudo apt install upx)
FROM golang:1.22 AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app .
FROM alpine
COPY --from=build /app/app /app
ENTRYPOINT ["/app"]
✅ 好处:
# /etc/systemd/system/app.service
[Unit]
Description=Go App
[Service]
ExecStart=/opt/app/app
WorkingDirectory=/opt/app
Restart=always
User=appuser
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable app
sudo systemctl start app
| 问题 | 原因 | 解决 |
|---|---|---|
| 放到别的机器跑不了 | glibc 不一致 | CGO_ENABLED=0 |
permission denied |
没 chmod | chmod +x |
| 编译慢 | 没开 cache | go build 会缓存 |
| 文件太大 | 没加 -s -w |
加 ldflags |
| Docker 起不来 | 用了 scratch 却 CGO | 用 alpine |
如果你能说一下:
我可以直接给你一套 最合适的打包命令或 Dockerfile。