可以的。在 Ubuntu 上用 Go 是可以静态打包(静态编译)的,而且 Go 默认就比其他语言更容易做到静态链接。
下面分几种常见情况说明:
如果你没有使用 cgo(比如没用 import "C"、没用 sqlite3 的 cgo 版等),默认就是静态可执行文件:
go build -o app main.go
检查是否静态:
file app
ldd app
如果看到:
not a dynamic executable
说明已经是静态二进制了 ✅
CGO_ENABLED=0 go build -o app main.go
这是最常用、最安全的静态打包方式。
如果用了 cgo(例如:
github.com/mattn/go-sqlite3那就不是纯静态了,会依赖 libc。
CGO_ENABLED=0 go build
sudo apt install musl-tools
CGO_ENABLED=1 CC=musl-gcc go build --ldflags '-extldflags "-static"' -o app
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"]
这样出来的镜像只有几 MB,且完全静态。
| 场景 | 是否静态 | 方法 |
|---|---|---|
| 纯 Go | ✅ | 默认 |
| Ubuntu 编译 | ✅ | CGO_ENABLED=0 |
| 用 cgo | ❌ | 需 musl |
| Docker | ✅ | scratch + CGO=0 |
如果你愿意,可以告诉我:
我可以给你精确可用的编译命令。