Golang项目Ubuntu打包最佳实践
sudo apt update && sudo apt install golang-go),安装后验证版本(go version)。go mod init <module-name>(如github.com/username/project),启用官方依赖管理;设置GOPROXY加速依赖下载(国内推荐export GOPROXY=https://goproxy.cn,direct)。PATH(如export PATH=$PATH:$HOME/go/bin),并启用Go Modules(export GO111MODULE=on,Go 1.16+默认开启)。go mod tidy自动清理未使用的依赖、下载缺失的依赖,确保go.mod和go.sum文件准确反映项目依赖;go list -m all可查看所有依赖版本。go.mod/go.sum并运行go mod download,避免每次构建都重新下载依赖(提升构建速度)。CGO_ENABLED=0禁用CGO,生成纯静态二进制文件(避免动态库依赖,适用于大多数Linux发行版,如Ubuntu、Alpine);配合-tags netgo确保网络库也静态链接。-ldflags="-s -w"去除调试信息和符号表(可减少20%-50%体积);通过upx --best进一步压缩(最高可减少70%,需安装sudo apt install upx)。-parallel <N>(N为CPU核心数),加速编译过程(如go build -parallel 4)。Makefile定义常用命令,例如:APP_NAME=myapp
BUILD_DIR=build
GOOS ?= linux
GOARCH ?= amd64
build:
mkdir -p $(BUILD_DIR)
go build -o $(BUILD_DIR)/$(APP_NAME) -v -ldflags="-s -w" -tags static CGO_ENABLED=0
compress:
upx --best $(BUILD_DIR)/$(APP_NAME)
clean:
rm -rf $(BUILD_DIR)
运行make build即可完成编译,make compress压缩,make clean清理。build.sh)实现自动化,例如:#!/bin/bash
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o app -ldflags="-s -w"
upx --best app
添加执行权限后(chmod +x build.sh)运行即可。golang镜像编译代码,运行阶段使用最小化镜像(如scratch或ubuntu:22.10)复制二进制文件。示例:# 编译阶段
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /app/main
# 运行阶段(最小化镜像)
FROM scratch
COPY --from=builder /app/main /
CMD ["/main"]
构建命令:docker build -t myapp .。FROM golang:1.21 as mod
WORKDIR /workspace
COPY go.mod go.sum .
RUN go mod download
FROM mod as build
COPY . .
RUN CGO_ENABLED=0 go build -o app -ldflags="-s -w" .
FROM ubuntu:22.10
RUN apt update && apt install -y tzdata ca-certificates
COPY --from=build /workspace/app /app
CMD ["/app"]
只要go.mod/go.sum不变,依赖不会重复下载。./app或nohup ./app &后台启动。systemd服务文件(如/etc/systemd/system/myapp.service),内容示例:[Unit]
Description=My Golang App
After=network.target
[Service]
ExecStart=/path/to/app
Restart=always
User=www-data
Group=www-data
[Install]
WantedBy=multi-user.target
启用并启动服务:systemctl enable myapp && systemctl start myapp。gpg --detach-sign --armor app对二进制文件签名,确保文件未被篡改;定期更新依赖(go get -u ./...)修复安全漏洞。