Docker多阶段构建实战指南 什么是多阶段构建 Docker多阶段构建(Multi-stage builds)是Docker 17.05+引入的一个强大特性,它允许你在一个Dockerfile中使用多个FROM指令,每个FROM指令开始一个新的构建阶段。通过多阶段构建,你可以只保留最终镜像需要的文件,大幅减小镜像体积。 为什么需要多阶段构建 在传统的Docker构建中,我们通常需要在同一个镜像中完成编译和运行,这导致: 镜像体积过大:包含编译工具、源代码、临时文件等运行时不需要的内容 安全风险增加:编译工具和源代码暴露在最终镜像中 构建效率低:每次修改代码都需要重新下载依赖 多阶段构建基础语法 实战案例 案例1:Go应用构建 传统单阶段构建的问题:
Docker多阶段构建(Multi-stage builds)是Docker 17.05+引入的一个强大特性,它允许你在一个Dockerfile中使用多个FROM指令,每个FROM指令开始一个新的构建阶段。通过多阶段构建,你可以只保留最终镜像需要的文件,大幅减小镜像体积。
在传统的Docker构建中,我们通常需要在同一个镜像中完成编译和运行,这导致:
# 第一阶段:构建阶段 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 第二阶段:运行阶段 FROM alpine:latest WORKDIR /root/ COPY --from=builder /app/myapp . CMD ["./myapp"]
传统单阶段构建的问题:
FROM golang:1.21 WORKDIR /app COPY . . RUN go build -o myapp CMD ["./myapp"]
这个镜像大小约为800MB+,包含了完整的Go编译工具链。
优化后的多阶段构建:
# 构建阶段 FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o myapp # 运行阶段 FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/myapp . CMD ["./myapp"]
优化后镜像大小仅为15MB左右,减少了98%以上!
# 构建阶段 FROM maven:3.8-openjdk-17 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=builder /app/target/*.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]
# 依赖安装阶段 FROM node:18-alpine AS deps WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # 构建阶段 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 生产运行阶段 FROM node:18-alpine AS runner WORKDIR /app ENV NODE_ENV production COPY --from=deps /app/node_modules ./node_modules COPY --from=builder /app/dist ./dist COPY package*.json ./ CMD ["node", "dist/main.js"]
FROM golang:1.21 AS builder # ... 构建逻辑 FROM alpine:latest COPY --from=builder /app/myapp .
docker build --target builder -t myapp:builder .
这对于调试构建过程或提取构建产物非常有用。
FROM golang:1.21 AS base RUN go mod download FROM base AS builder # 复用base阶段下载的依赖
FROM --platform=$BUILDPLATFORM golang:1.21 AS builder ARG TARGETPLATFORM ARG BUILDPLATFORM RUN echo "Building on $BUILDPLATFORM, targeting $TARGETPLATFORM"
以一个典型的Go应用为例:
| 构建方式 | 镜像大小 | 构建时间 | 安全性 |
|---|---|---|---|
| 单阶段构建 | 820MB | 45s | 低(包含编译工具) |
| 多阶段构建 | 15MB | 42s | 高(仅包含二进制) |
镜像体积减少了98%,构建时间基本相当,但安全性和可维护性大幅提升。
Docker多阶段构建是现代容器化应用的最佳实践之一,它能够:
在2026年的云原生环境中,掌握多阶段构建技巧已经成为后端工程师的基本技能要求。建议在所有生产环境的Dockerfile中采用多阶段构建策略。
发布日期:2026年03月27日
主题:Docker多阶段构建深入解析