多阶段构建(Multi-stage builds)
多阶段构建是 Docker 提供的一种镜像优化技术,通过在一个 Dockerfile 中使用多个 FROM 指令,将构建环境与运行环境分离,从而生成体积更小、干净的生产镜像。
1. 多阶段构建原理
- 每个
FROM指令定义一个阶段(Stage) - 前一个阶段可以构建编译产物或依赖
- 最终阶段只复制需要的运行文件,减少无用层和文件
2. 示例:Go 应用多阶段构建
dockerfile
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 运行阶段
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]builder阶段安装编译工具并构建应用- 最终镜像只包含可执行文件,体积小且安全
3. 示例:Node.js 应用多阶段构建
dockerfile
# 构建阶段
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html- 构建阶段完成依赖安装和代码打包
- 运行阶段只包含静态文件和轻量 Web 服务器
4. 多阶段构建优势
- 显著减小最终镜像体积
- 隔离构建工具和生产环境
- 提高安全性,减少攻击面
- 利于 CI/CD 自动化构建和部署
5. 最佳实践
- 仅复制运行所需的文件到最终阶段
- 合理命名阶段,便于管理和调试
- 尽量选择轻量基础镜像作为最终阶段
- 利用缓存,优化重复构建时间
掌握多阶段构建技术,可以有效优化 Docker 镜像,提升开发、测试和生产环境的部署效率。