# 多阶段构建（Multi-stage builds）

URL: https://caijiao.org/docker/images/multi-stage
Source: docs/docker/images/multi-stage.md
Description: 本章节讲解 Docker 多阶段构建的原理、使用方法及最佳实践，帮助开发者通过分阶段构建减小镜像体积、提高构建效率，并实现生产环境镜像的优化。

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