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

小贴士

  1. .dockerignore 排除 .git、node_modules 等
  2. 把变化少的层放前面利用缓存
  3. docker image history 查看每层大小,找到膨胀点

镜像瘦身不只是省磁盘——拉取更快、部署更快、攻击面更小。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝