# 构建缓存与性能优化

URL: https://caijiao.org/docker/dockerfile/caching
Source: docs/docker/dockerfile/caching.md
Description: 本章节介绍 Docker 镜像构建过程中的缓存机制与优化方法，包括分层构建、指令顺序优化、多阶段构建和减少镜像体积，帮助开发者提升构建效率和镜像性能。

在构建 Docker 镜像时，合理利用缓存和优化构建流程，可以显著提升构建速度并减小镜像体积。

## 1. 构建缓存机制

- Docker 镜像由多层（Layer）组成，每条指令生成一层
- Docker 会缓存已经构建的层，如果指令及上下文未变化，则直接复用缓存
- 使用缓存可以加快重建镜像速度

示例：

```dockerfile
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app
````

- 只有 `requirements.txt` 变化时才重新执行 pip 安装

## 2. 优化指令顺序

- 将不常变化的操作放在前面，常变化的操作放在后面
- 例如：

```dockerfile
# 不常变化
RUN apt-get update && apt-get install -y python3

# 常变化
COPY . /app
```

## 3. 多阶段构建（Multi-stage Build）

- 用于减少最终镜像体积
- 第一阶段安装依赖或编译，第二阶段只拷贝产物

```dockerfile
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
```

- 优点：

  - 最终镜像更小
  - 不包含构建工具，提升安全性

## 4. 减少镜像体积

- 使用轻量基础镜像（如 alpine、slim）
- 删除临时文件和缓存：

```dockerfile
RUN apt-get update && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*
```

- 使用 `.dockerignore` 排除无关文件，减少构建上下文

## 5. 缓存清理与构建加速

- 清理未使用镜像和卷：

```bash
docker system prune -a
```

- 使用 BuildKit 提升构建速度：

```bash
DOCKER_BUILDKIT=1 docker build -t myapp .
```

---

掌握 Docker 镜像缓存机制和性能优化技巧，可以提高构建效率、减少镜像体积，并保证容器部署的快速与稳定。
