你问的“Ubuntu 下 Golang 难打包”,通常不是 Go 语言本身的问题,而是环境、依赖、目标系统差异导致的。下面分点说明常见原因和解决办法。
如果代码里用了:
netos/usermattn/go-sqlite3)Go 会启用 CGO,需要:
gcclibc(glibc)结果:
version 'GLIBC_2.34' not found
✅ 解决:
CGO_ENABLED=0 go build
或静态编译:
CGO_ENABLED=0 go build -ldflags '-extldflags "-static"'
Ubuntu 默认:
✅ 解决:
scratch / distroless 镜像本地是:
服务器可能是:
✅ 交叉编译:
GOOS=linux GOARCH=arm64 go build
Ubuntu 常用 systemd:
.servicesystemctl示例:
[Unit]
Description=myapp
[Service]
ExecStart=/opt/myapp/myapp
Restart=always
[Install]
WantedBy=multi-user.target
Ubuntu 可选:
debsnap但:
deb 要 dpkg-debsnap 规则严格✅ 简单方案:
goreleaserCGO_ENABLED=0 go build -o myapp
适合:
FROM golang:1.22 AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app
FROM scratch
COPY --from=build /app/app /app
ENTRYPOINT ["/app"]
goreleaser release
自动:
Ubuntu 下 Go “难打包”,不是 Go 难,而是系统依赖和发布方式没选对。
如果你愿意,可以告诉我:
我可以直接给你一套“能跑”的打包方案。