温馨提示×

golang打包ubuntu注意啥

小樊
44
2026-10-10 06:02:59
栏目: 编程语言

在 Ubuntu(Linux) 环境下用 Go(Golang) 打包/构建程序,有几个常见坑和注意点,下面按「重要程度」给你总结:


一、交叉编译 / 目标平台

如果你在 macOS / Windows 上打包给 Ubuntu 用:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app

常见平台:

  • GOOS=linux
  • GOARCH=amd64 / arm64

⚠️ 注意:

  • 默认开启 CGO 会依赖 glibc
  • 服务器若用 Alpine(musl),要特别处理

二、CGO 问题(非常关键)

1️⃣ 纯 Go 程序(推荐)

CGO_ENABLED=0 go build

✅ 不依赖系统库
✅ 可在 Ubuntu / Alpine 直接运行

2️⃣ 用到 CGO(sqlite / 某些加密库)

CGO_ENABLED=1 go build

⚠️ 会依赖:

  • glibc
  • gcc

Ubuntu 需要:

sudo apt install gcc

三、Ubuntu 版本 & glibc 兼容性

  • Ubuntu 20.04 / 22.04 / 24.04 都能跑 Go
  • 低版本 Ubuntu 可能无法运行高版本编译的程序
    • 特别是用新 GCC 编译的 CGO 程序

✅ 建议:

  • 在 目标系统相同版本 上编译
  • 或使用 Docker 构建

四、使用 Docker 打包(最稳)

示例(Ubuntu 基础镜像)

FROM ubuntu:22.04
WORKDIR /app
COPY app /app/app
RUN chmod +x /app/app
CMD ["/app/app"]

构建:

docker build -t myapp .

五、可执行权限

Ubuntu 必须有执行权限:

chmod +x app
./app

不然会:

Permission denied

六、端口 / 防火墙

  • 监听端口需要权限:
    • < 1024 需要 root
  • Ubuntu 防火墙:
sudo ufw allow 8080

七、systemd 部署(生产常用)

[Unit]
Description=Go App

[Service]
ExecStart=/opt/app/app
WorkingDirectory=/opt/app
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl enable app
sudo systemctl start app

八、依赖 & 静态资源

Go 默认 不会打包:

  • html
  • config
  • static 文件

✅ 解决方式:

  • 使用 embed
//go:embed config.yaml
var cfg []byte
  • 或部署时一起拷贝

九、日志 & 时区

Ubuntu 默认 UTC
Go 程序注意:

time.LoadLocation("Asia/Shanghai")

或容器中:

ENV TZ=Asia/Shanghai

十、常见错误速查

问题 原因
not found CGO / glibc 缺失
permission denied 没 chmod
signal: killed 内存不足
无法监听端口 权限 / 防火墙

如果你愿意,可以告诉我:

  • ✅ 是否在 Docker
  • ✅ 是否用 sqlite / CGO
  • ✅ 目标 Ubuntu 版本

我可以给你 更精确的打包方案。

0 踩