# 构建与优化镜像

URL: https://caijiao.org/docker/images/build-and-optimize
Source: docs/docker/images/build-and-optimize.md
Description: 本章节介绍如何构建高质量的 Docker 镜像，并讲解镜像优化技巧，包括多阶段构建、减少层数、选择轻量基础镜像以及缓存利用，帮助开发者提升构建效率和运行性能。

Docker 镜像是容器运行的基础。构建高效、体积小、可复用的镜像不仅能节省存储和带宽，还能提升容器启动速度和部署效率。本节讲解镜像构建流程和优化方法。

## 1. 使用 Dockerfile 构建镜像

示例 Dockerfile：

```dockerfile
# 使用官方 Python 基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 设置启动命令
CMD ["python", "app.py"]
````

构建镜像：

```bash
docker build -t myapp:1.0 .
```

## 2. 镜像优化策略

### 2.1 多阶段构建（Multi-stage build）

减少最终镜像体积，只保留运行所需内容：

```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"]
```

### 2.2 选择轻量基础镜像

* Alpine、Distroless 等镜像体积小，减少安全风险

### 2.3 减少镜像层数

* 合并多条 `RUN` 指令：

```dockerfile
RUN apt-get update && apt-get install -y curl vim && rm -rf /var/lib/apt/lists/*
```

### 2.4 利用缓存加速构建

* 避免不必要的 COPY 或 RUN 修改，保证上层缓存可复用

### 2.5 清理无用文件

* 删除临时文件、构建工具和缓存，减小镜像体积

## 3. 镜像构建最佳实践

* 明确分层顺序，先不易变的内容再放易变内容
* 尽量使用官方或可信基础镜像
* 对关键依赖固定版本，保证镜像可复现
* 定期扫描镜像漏洞，确保安全

---

通过合理构建和优化镜像，你可以创建小巧、高效、可维护的 Docker 镜像，为容器部署和持续交付提供坚实基础。
