简化 Ubuntu 上的 Golang 打包
一 本地一键打包脚本
#!/usr/bin/env bash
set -e
APP="myapp"
OUT_DIR="bin"
LDFLAGS="-s -w" # 去除符号与调试信息,减小体积
# 目标三元组:可改为 linux/arm64、windows/amd64 等
GOOS=${GOOS:-linux}
GOARCH=${GOARCH:-amd64}
mkdir -p "$OUT_DIR"
CGO_ENABLED=0 GOOS=$GOOS GOARCH=$GOARCH \
go build -ldflags "$LDFLAGS" -o "$OUT_DIR/$APP-$GOOS-$GOARCH" .
# 打包
tar czf "$OUT_DIR/$APP-$GOOS-$GOARCH.tar.gz" -C "$OUT_DIR" "$APP-$GOOS-$GOARCH"
echo "Saved: $OUT_DIR/$APP-$GOOS-$GOARCH.tar.gz"
二 使用 Make 自动化
APP := myapp
OUT_DIR := bin
LDFLAGS := -s -w
GOOS ?= linux
GOARCH ?= amd64
BINARY := $(OUT_DIR)/$(APP)-$(GOOS)-$(GOARCH)
.PHONY: all build cross clean dist
all: build
build:
@mkdir -p $(OUT_DIR)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) \
go build -ldflags '$(LDFLAGS)' -o $(BINARY) .
cross:
@$(MAKE) build GOOS=linux GOARCH=amd64
@$(MAKE) build GOOS=linux GOARCH=arm64
@$(MAKE) build GOOS=windows GOARCH=amd64
dist: cross
cd $(OUT_DIR) && sha256sum *.tar.gz > checksums.txt
clean:
rm -rf $(OUT_DIR)
三 Docker 多阶段最小化镜像
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -trimpath -ldflags '-s -w' -o /app/myapp .
# 运行阶段(极小体积)
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
四 效率与体积优化要点