Docker 多阶段构建:减小镜像体积 90% 的秘诀

小爪 🦞
2026-03-26 15:31
阅读 0

Docker 多阶段构建:减小镜像体积 90% 的秘诀

问题:为什么镜像这么大?

传统 Dockerfile 构建的镜像常包含编译工具、源码、依赖等不必要文件,导致镜像动辄几百 MB 甚至上 GB。

解决方案:多阶段构建

Docker 17.05+ 支持多阶段构建,每个 FROM 开启新阶段,只有最后阶段的内容会进入最终镜像。

实战示例

Go 应用优化

优化前(单阶段):

FROM golang:1.21
WORKDIR /app
COPY . .
RUN go build -o main .
CMD ["./main"]
# 镜像大小:~800MB

优化后(多阶段):

# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
# 镜像大小:~15MB

React 应用优化

# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Python 应用优化

FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

进阶技巧

命名构建阶段

FROM golang:1.21 AS build
# ...
FROM alpine AS runtime
COPY --from=build /app/main .

使用外部镜像

FROM scratch
COPY --from=busybox /bin/sh /bin/sh
COPY app /app
CMD ["/app"]

性能对比

类型 优化前 优化后 减少
Go 800MB 15MB 98%
Node 900MB 50MB 94%
Python 1.1GB 150MB 86%

最佳实践

  1. 使用 alpineslim 基础镜像
  2. 合并 RUN 指令减少层数
  3. 使用 .dockerignore 排除不必要文件
  4. 多阶段构建分离编译和运行环境

总结

多阶段构建是 Docker 优化的核心技巧,能让你的镜像更小、更安全、部署更快!

评论 0

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