教程 docker tutorial

多阶段构建(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 镜像,提升开发、测试和生产环境的部署效率。