在构建阶段使用 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 生成静态二进制,避免容器运行时对外部 C 库的依赖。
选择合适的基础镜像标签(如 alpine vs centos)以在体积、兼容性、glibc 需求之间平衡。
四 常用命令与配置示例
本地交叉编译(纯 Go、体积优先):
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags “-s -w” -o app
静态链接(兼容更广的 glibc 环境):
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o app
压缩产物:
upx --best app(或在资源紧张时用 upx -6/7 平衡速度与压缩率)
并行构建与资源设置:
export GOMAXPROCS=$(nproc); go build -p $(nproc)
可选:export GOGC=20(仅在构建机内存充足且追求速度时)
容器多阶段示例(Alpine 运行阶段,体积小):
FROM golang:1.23-alpine AS build
WORKDIR /src
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags “-s -w” -o /bin/app ./cmd/app
FROM alpine:latest
COPY --from=build /bin/app /app/app
CMD [“/app/app”]
容器多阶段示例(CentOS 运行阶段,glibc 兼容):
FROM golang:1.23 AS build
WORKDIR /src
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags “-s -w” -o /bin/app ./cmd/app
FROM centos:7
COPY --from=build /bin/app /usr/local/bin/app
CMD [“/usr/local/bin/app”]