# 镜像最小化与不运行 root

URL: https://caijiao.org/docker/security/minimize-images
Source: docs/docker/security/minimize-images.md
Description: 本章节介绍如何构建最小化 Docker 镜像并避免使用 root 用户运行容器，包括使用轻量基础镜像、删除不必要依赖、创建非 root 用户等方法，提升镜像安全性和运行可靠性。

在 Docker 安全最佳实践中，减小镜像体积和避免 root 用户运行容器可以降低攻击面和潜在风险。

## 1. 镜像最小化

- 选择轻量基础镜像：
  - Alpine、Debian Slim 等

```dockerfile
FROM alpine:3.18
````

- 多阶段构建（Multi-stage build）：

  - 构建阶段安装依赖和编译
  - 最终镜像只包含运行所需文件

```dockerfile
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]
```

- 删除不必要文件与缓存：

```dockerfile
RUN apt-get update && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*
```

## 2. 不运行 root 用户

- 创建非 root 用户并切换：

```dockerfile
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
```

- 好处：

  - 降低容器被入侵后系统权限风险
  - 遵守安全合规要求

- 验证当前用户：

```bash
whoami
```

## 3. 配置文件和数据权限

- 为非 root 用户设置适当权限：

```dockerfile
RUN mkdir /app/data && chown -R appuser:appgroup /app/data
```

- 挂载卷时，确保目录权限正确：

```yaml
volumes:
  - ./data:/app/data:rw
```

## 4. 最佳实践总结

- 使用最小基础镜像，减少攻击面
- 多阶段构建降低最终镜像体积
- 不以 root 用户运行容器，提高安全性
- 对挂载卷和数据目录设置正确权限
- 定期扫描镜像漏洞，确保安全

---

通过镜像最小化和非 root 用户运行策略，可以构建更安全、轻量且易于维护的 Docker 镜像，保障容器化应用在生产环境中的稳定运行。
