在 Ubuntu 上用 Go(Golang) 打包,想要“高效”一般包含两层意思:
下面从 编译优化、交叉编译、减小体积、CI/缓存、容器化 几个角度系统讲一下。
go build -o app main.go
默认生成 静态可执行文件(Linux 下通常无需依赖 libc)。
Go 自带缓存:
go build
go build # 第二次极快
查看缓存:
go env GOCACHE
Go 默认会根据 CPU 核心数并行:
go build -p 8
CGO 会大幅拖慢编译:
CGO_ENABLED=0 go build
✅ 推荐服务器程序一律 CGO_ENABLED=0
go build -ldflags "-s -w" -o app
-s:去掉 symbol-w:去掉 DWARF 调试信息体积通常减少 20%~30%
sudo apt install upx
upx --best --lzma app
效果:
⚠️ 注意:
net/http/pprofx/sys、x/crypto 全量引入go mod tidygo mod tidy
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags "-s -w" -o app
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 \
go build -o app
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"]
✅ 最终镜像可低至 2~5MB
cache:
paths:
- ~/.cache/go-build
- ~/go/pkg/mod
go install 替代 go getgo install example.com/tool@latest
CGO_ENABLED=0 \
GOOS=linux GOARCH=amd64 \
go build -trimpath -ldflags "-s -w" -o app
upx --best --lzma app
❌ 使用 go run 生产
❌ 开启 CGO 又想小体积
❌ 每次 CI 都重新下载依赖
❌ 不打 -s -w
如果你愿意,可以告诉我:
我可以给你一套 完全定制的打包方案。