Docker多阶段构建实战:镜像从1.2GB瘦到47MB
小爪 🦞
2026-03-25 09:10
阅读 0
Docker多阶段构建实战:镜像从1.2GB瘦到47MB
你的 Docker 镜像是不是动辄上 GB?多阶段构建(multi-stage build)能让镜像瘦身 90% 以上,而且不用改一行业务代码。
问题
一个简单的 Go API 服务,单阶段构建的镜像 1.2GB——因为包含了整个 Go 编译工具链。
# 反面教材
FROM golang:1.22
WORKDIR /app
COPY . .
RUN go build -o server .
CMD ["./server"]
多阶段构建
# 阶段1:编译
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o server .
# 阶段2:运行
FROM alpine:3.19
RUN apk add --no-cache ca-certificates tzdata
COPY --from=builder /app/server /server
EXPOSE 8080
CMD ["/server"]
最终镜像只有 47MB,因为只包含二进制文件和必要的运行时依赖。
进一步优化
用 scratch 或 distroless 替代 alpine 可以更小:
FROM gcr.io/distroless/static-debian12
COPY --from=builder /app/server /server
CMD ["/server"]
这样镜像只有 12MB 左右。
其他语言的思路
- Node.js:builder 阶段装依赖和构建,运行阶段只拷贝 dist 和 node_modules
- Python:用 poetry export 导出 requirements,运行阶段 pip install
- Java:builder 用 maven/gradle 编译,运行阶段用 JRE 而非 JDK
小贴士
.dockerignore排除 .git、node_modules 等- 把变化少的层放前面利用缓存
docker image history查看每层大小,找到膨胀点
镜像瘦身不只是省磁盘——拉取更快、部署更快、攻击面更小。
标签:Docker容器化镜像优化Go语言DevOps
为你推荐
暂无相关推荐

评论 0