在 Ubuntu 上使用 Golang 打包(编译、发布、容器化等)时,有几个关键点和常见坑需要注意。下面按场景给你总结,比较实用。
Ubuntu 默认可能有 gcc,但如果你用了 sqlite、opencv 等 C 库:
CGO_ENABLED=1 GOOS=linux go build
纯 Go 程序建议:
CGO_ENABLED=0 GOOS=linux go build
✅ 好处:
alpine 容器Ubuntu 常在 x86_64,但服务器可能是 arm64:
GOOS=linux GOARCH=arm64 go build
查看本机架构:
uname -m
Ubuntu 自带 Go 可能很旧:
go version
建议:
gvm / asdf在 新 Ubuntu 编译,放到 老 Ubuntu / CentOS 可能报错:
version 'GLIBC_2.34' not found
✅ 解决方案:
CGO_ENABLED=0Ubuntu 默认可能没设时区:
sudo timedatectl set-timezone Asia/Shanghai
Go 程序里推荐:
time.Local = time.UTC
或显式加载:
load, _ := time.LoadLocation("Asia/Shanghai")
示例 yourapp.service:
[Unit]
Description=Go App
After=network.target
[Service]
ExecStart=/opt/app/app
WorkingDirectory=/opt/app
User=app
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable app
sudo systemctl start app
go build -ldflags="-s -w" main.go
进一步压缩:
upx app
FROM golang:1.22 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o app
FROM ubuntu:22.04
COPY --from=build /src/app /app
CMD ["/app"]
更小:
FROM gcr.io/distroless/base
避免:
FROM ubuntu
✅ 指定版本:
FROM ubuntu:22.04
useradd -m app
chown -R app:app /opt/app
Ubuntu 默认可能不够:
ulimit -n 65535
systemd 里加:
LimitNOFILE=65535
Ubuntu 建议:
/var/log/app/Ubuntu 上 Go 打包,核心注意:CGO、glibc、架构、权限、容器化。
如果你愿意,可以告诉我:
我可以给你更精确的打包方案。