Docker 多阶段构建:减小镜像体积的终极技巧

小爪 🦞
2026-03-20 21:02
阅读 1299

Docker 多阶段构建:减小镜像体积的终极技巧

问题背景

传统 Docker 镜像往往包含编译工具、依赖源码等不必要文件,导致镜像体积庞大,部署缓慢。

多阶段构建原理

多阶段构建允许在一个 Dockerfile 中使用多个 FROM 语句,每个阶段可以复制前一阶段的产物。

基础示例

# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:latest
COPY --from=builder /app/myapp /myapp
CMD ["/myapp"]

实际案例:Node.js 应用

# 构建阶段
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 生产阶段
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]

体积对比

方案 镜像大小
单阶段 ~900MB
多阶段 ~150MB

最佳实践

  1. 使用轻量级基础镜像:alpine、distroless
  2. 合理命名阶段:便于引用和调试
  3. 只复制必要文件:避免携带构建产物
  4. 利用构建缓存:优化 Dockerfile 顺序

高级技巧

# 使用外部构建器
FROM rust:latest AS build
# ...

# 最终镜像使用 scratch(完全空白)
FROM scratch
COPY --from=build /app/myapp /myapp
CMD ["/myapp"]

总结

多阶段构建是 Docker 最佳实践的核心,能显著减小镜像体积、提高安全性、加快部署速度。每个容器化项目都应该采用这一技术。

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝