温馨提示×

golang ubuntu打包要注意啥

小樊
49
2026-10-01 10:24:15
栏目: 编程语言

在 Ubuntu 上使用 Golang 打包(编译)程序时,通常要注意下面几个方面,按「常见坑 → 推荐做法」来说:


一、基础编译注意事项

1. 确保 GOOS / GOARCH 正确

如果你要 交叉编译 或 给其他系统用:

# 查看当前环境
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

⚠️ 注意:

  • Ubuntu 默认是 linux/amd64
  • ARM 服务器要特别注意 GOARCH=arm64

2. CGO 的问题(非常重要)

Ubuntu 上 默认可能启用了 CGO

go env CGO_ENABLED

情况 A:纯 Go 程序(推荐)

CGO_ENABLED=0 go build -o app main.go

✅ 优点:

  • 不依赖 glibc
  • 可直接放到 Alpine / 其他 Linux 运行
  • 适合 Docker

情况 B:用了 sqlite / 某些库

必须开启 CGO:

CGO_ENABLED=1 go build -o app main.go

⚠️ 注意:

  • 目标机器要有 相同版本的 gcc / glibc
  • 不然会报 version 'GLIBC_2.34' not found

二、Ubuntu 系统相关注意点

3. gcc / 构建工具是否安装

如果用到 CGO:

sudo apt update
sudo apt install -y build-essential

验证:

gcc --version

4. 动态库依赖检查

编译完后检查依赖:

ldd app

如果看到:

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6

说明依赖系统库(CGO 开启)


三、打包成可执行文件 / 发布

5. 给执行权限

chmod +x app

6. 使用 -ldflags 减小体积

go build -ldflags="-s -w" -o app main.go

可选配合:

upx app

(Ubuntu 安装:sudo apt install upx)


四、Docker 打包(强烈推荐)

7. 多阶段构建(最佳实践)

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"]

✅ 好处:

  • 体积小
  • 环境一致
  • 不怕 Ubuntu 版本差异

五、系统服务相关(可选)

8. 用 systemd 运行

# /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

如果你能说一下:

  • 是 本地运行 / Docker / 服务器部署
  • 是否用到 数据库(如 sqlite)
  • 目标系统(Ubuntu 版本 / ARM / x86)

我可以直接给你一套 最合适的打包命令或 Dockerfile。

0 踩