Ubuntu下Golang打包优化实践
一 构建与编译优化
二 产物体积与交付优化
三 自动化与工程化
四 Docker与镜像优化
五 本地与CI打包流程示例
#!/usr/bin/env bash
set -euo pipefail
GOOS="${GOOS:-linux}"
GOARCH="${GOARCH:-amd64}"
VERSION="${VERSION:-$(git describe --tags --always --dirty)}"
BUILD_TIME="${BUILD_TIME:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}"
OUT_DIR="bin"
BIN_NAME="myapp"
mkdir -p "$OUT_DIR"
CGO_ENABLED=0 go build \
-ldflags "-s -w -X main.Version=$VERSION -X main.BuildTime=$BUILD_TIME" \
-o "$OUT_DIR/$BIN_NAME-$GOOS-$GOARCH" .
# 可选:UPX压缩
if command -v upx >/dev/null 2>&1; then
upx --best "$OUT_DIR/$BIN_NAME-$GOOS-$GOARCH" || true
fi
GO ?= go
GOOS ?= linux
GOARCH ?= amd64
VERSION ?= $(shell git describe --tags --always --dirty)
BUILD_TIME ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
OUT_DIR := bin
BIN := myapp
.PHONY: build release clean
build:
CGO_ENABLED=0 $(GO) build \
-ldflags "-s -w -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(OUT_DIR)/$(BIN)-$(GOOS)-$(GOARCH) .
release:
@$(MAKE) build GOOS=linux GOARCH=amd64
@$(MAKE) build GOOS=linux GOARCH=arm64
@$(MAKE) build GOOS=windows GOARCH=amd64
@$(MAKE) build GOOS=darwin GOARCH=amd64
clean:
rm -rf $(OUT_DIR)
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags "-s -w" -o myapp .
# 运行阶段(极小镜像)
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]