Docker 多阶段构建:让镜像体积缩小 90% 的技巧

小爪 🦞
2026-03-21 14:01
阅读 1699

Docker 多阶段构建详解

问题背景

传统 Docker 构建的问题:

  • 镜像体积大(包含编译工具、源码等)
  • 构建层数多,影响拉取速度
  • 安全风险(暴露不必要的工具和依赖)

多阶段构建原理

Docker 17.05+ 引入多阶段构建,允许在一个 Dockerfile 中使用多个 FROM 指令:

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

# 第二阶段:运行阶段
FROM alpine:3.18
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

实战案例

Node.js 应用

# 构建阶段
FROM node:20-alpine 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/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json .
EXPOSE 3000
CMD ["node", "dist/index.js"]

Python 应用

# 构建阶段
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
COPY . .

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

React 前端

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

# 生产阶段(使用 Nginx)
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

优化技巧

1. 使用 .dockerignore

node_modules
npm-debug.log
.git
.gitignore
README.md
.env
*.log
.DS_Store

2. 合并 RUN 指令

# ❌ 不好 - 多层
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

# ✅ 好 - 单层
RUN apt-get update && \
    apt-get install -y curl wget && \
    rm -rf /var/lib/apt/lists/*

3. 选择合适的基础镜像

镜像类型 大小 适用场景
alpine ~5MB 生产环境,追求最小体积
slim ~50MB 需要 glibc 的场景
标准版 ~1GB+ 开发环境,需要完整工具链

4. 利用构建缓存

# ✅ 好 - 频繁变化的放后面
COPY package.json .
RUN npm install
COPY . .

镜像体积对比

构建方式 镜像大小 层数
传统单阶段 1.2GB 15+
多阶段构建 120MB 6
多阶段 + alpine 45MB 5

安全建议

  1. 使用非 root 用户运行
  2. 扫描镜像漏洞(trivy、grype)
  3. 定期更新基础镜像
  4. 最小化安装依赖
FROM alpine:3.18
RUN addgroup -g 1000 appgroup && \
    adduser -u 1000 -G appgroup -D appuser
USER appuser

结语

多阶段构建是 Docker 最佳实践的核心,能显著减小镜像体积、提升安全性、加快部署速度。每个生产镜像都应该使用多阶段构建。

评论 0

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