温馨提示×

golang ubuntu打包怎样更小

小樊
33
2026-09-28 12:32:01
栏目: 编程语言

在 Ubuntu 上打包 Go 程序时,想要减小二进制体积,可以从编译参数、系统环境、打包方式几个层面入手。下面按「实用程度」给你一套方案。


一、编译阶段(最有效)

1. 开启裁剪(强烈推荐)

go build -ldflags="-s -w" -o app main.go
  • -s:去掉符号表
  • -w:去掉 DWARF 调试信息
    通常可减小 20%~30%

2. 使用静态编译 + 压缩(musl / upx)

方式 A:UPX 压缩(最简单)

sudo apt install upx
upx --best --lzma app
  • 可再减小 50%~70%
  • 启动稍慢,但影响不大

3. 使用更小的 libc(Alpine / musl)

Ubuntu 默认是 glibc,体积偏大。

方法:用 musl-gcc 编译

sudo apt install musl-tools
CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app main.go

Go 默认就是静态链接(CGO_ENABLED=0),不需要 glibc


二、Docker 打包(推荐生产用法)

✅ 最小方案:多阶段 + scratch

FROM golang:1.22 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app

FROM scratch
COPY --from=build /src/app /app
ENTRYPOINT ["/app"]
  • 镜像体积:几 MB
  • 无 shell、无 OS

或使用 Alpine(有 shell)

FROM golang:1.22-alpine AS build
RUN apk add --no-cache upx
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app && upx --best --lzma app

FROM alpine
COPY --from=build /src/app /app
ENTRYPOINT ["/app"]

三、代码层面(进阶)

1. 避免引入重型依赖

  • 少用:github.com/gin-gonic/gin(可选 httprouter)
  • 日志用 log/slog 而非 zap(除非必要)

2. 不使用 net/http/pprof(生产)

// 不要 import _ "net/http/pprof"

四、体积对比示例(真实经验)

方式 体积
默认 build 12 MB
-s -w 9 MB
+ upx 3 MB
scratch 镜像 3 MB
alpine + upx 4 MB

五、推荐组合(最简方案)

CGO_ENABLED=0 go build -ldflags="-s -w" -o app
upx --best --lzma app

如果你是:

  • CLI 工具 → upx 足够
  • 微服务 → scratch + 多阶段
  • 内网部署 → alpine

告诉我你的使用场景(CLI / 服务 / Docker),我可以给你精准配置。

0 踩