golang在ubuntu打包的步骤
在Ubuntu上打包Go程序需先安装Go环境并配置环境变量,通过gobuild构建可执行文件。利用CGO_ENABLED=0、GOOS和GOARCH实现交叉编译生成多平台二进制,可用UPX压缩体积。采用Docker多阶段构建容器化镜像,借助Makefile或脚本实现自动化打包。
在 Ubuntu 上打包 Golang 程序,其实没有想象中那么复杂。很多开发者习惯在本地写好代码,直接 go build 完事,但一旦涉及到跨平台分发、容器部署或者交付给测试环境,就会发现事情没那么简单。今天就把这条完整的打包链路梳理一遍——从环境搭建,到交叉编译,再到容器化,一步不落。

一、准备环境
首先,Go 语言环境得装好。两种主流方式任选其一:
- 用发行版仓库:
sudo apt-get update && sudo apt-get install -y golang—— 省心,但版本可能不是最新的。 - 从官网下载二进制包:
wget https://golang.google.cn/dl/go1.22.0.linux-amd64.tar.gz && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz—— 推荐,版本可控。
环境变量需要配置好,写入 ~/.bashrc 或 /etc/profile:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
执行 source ~/.bashrc 让它生效,然后 go version 确认版本号已正常输出即可。
二、本地构建可执行文件
进入项目根目录(确保有 main.go 或 go.mod),先拉取依赖:
go mod tidy
然后直接构建:
go build -o myapp main.go
生成的 myapp 在 Linux 下默认就是可执行的,运行 ./myapp 测试一下,没问题再往下走。
三、交叉编译与多平台产物
这是 Go 最方便的地方——一套代码,编译出不同平台的二进制文件。关键在于三个环境变量:
CGO_ENABLED=0:禁用 CGO,得到静态二进制,避免跨平台时的动态链接问题。GOOS:目标操作系统,比如linux、windows、darwin。GOARCH:目标架构,比如amd64、arm64。
举几个常用例子:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/myapp-linux-amd64 main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o bin/myapp-windows-amd64.exe main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bin/myapp-darwin-amd64 main.go
如果平台很多,一个个手动跑太麻烦,可以借助 gox 实现批量构建:
go get github.com/mitchellh/gox
gox -output="bin/myapp_{{.OS}}_{{.Arch}}" main.go
四、减小体积与产物归档
编译出来的二进制文件通常不小,尤其是静态链接后。想进一步瘦身,可以用 UPX 压缩:
sudo apt-get install -y upx
upx --best bin/myapp-linux-amd64
压缩效果很明显,不过极少数场景下可能会有启动开销,实测影响不大。然后打包成归档文件方便分发:
tar czvf myapp-linux-amd64.tar.gz bin/myapp-linux-amd64
zip myapp-linux-amd64.zip bin/myapp-linux-amd64
五、容器化打包与自动化
生产环境里,Docker 镜像几乎是标准交付方式。多阶段构建既能减小镜像体积,又能保证编译环境干净:
# Dockerfile
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
构建镜像:docker build -t myapp:latest .
运行容器:docker run --rm -p 8080:8080 myapp:latest
如果不想每次手动敲 docker 命令,写个 Makefile 或 Shell 脚本更省力。Makefile 示例:
GO := go
OUT := bin/myapp
build:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -o $(OUT) .
clean:
rm -f $(OUT)
使用时 make build 或 make clean。也可以写一个 build.sh,赋予执行权限 chmod +x build.sh,然后 ./build.sh build 即可。
整套流程跑通之后,后续只需要关注代码本身,打包分发的事情交给脚本和 Docker 就好。效率提升不止一点点。


































