在 Ubuntu 上优化 Golang 打包(build / release),可以从编译参数、依赖管理、容器化、CI/CD、二进制体积几个方向入手。下面按“常用且有效”的方式给你一套实践方案。
go build -ldflags="-s -w" -o app main.go
-s:去掉符号表-w:去掉 DWARF 调试信息dlv 调试CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags="-s -w" -o app
CGO_ENABLED=0:生成纯静态二进制,适合 Dockerupx(强烈推荐)sudo apt install upx
upx --best --lzma app
通常可缩小 50%~70%
go mod tidy
避免引入无用库(尤其 x/ 系列)
encoding/json → 可考虑 json-iteratorzerolog / logrus 较重)FROM golang:1.22 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app
FROM gcr.io/distroless/static
COPY --from=build /src/app /app
ENTRYPOINT ["/app"]
优点:
sudo apt install dpkg-dev
目录结构:
myapp/
├── DEBIAN/control
├── usr/local/bin/app
dpkg-deb --build myapp
适合:
export GOCACHE=$HOME/.cache/go-build
go build
go build -p 8
GitHub Actions 示例:
- uses: actions/cache@v3
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
go vet ./...
staticcheck ./...
go mod verify
| 问题 | 解决 |
|---|---|
GLIBC 不兼容 |
用 CGO_ENABLED=0 |
| 时区错误 | 打包 /usr/share/zoneinfo 或设 TZ |
| 权限问题 | chmod +x & capabilities |
开发:
go build
生产:
CGO_ENABLED=0 go build -ldflags="-s -w"
upx --best --lzma app
docker build -t app:1.0 .
如果你能补充:
我可以直接给你一套可复制的打包脚本。