镜像构建最佳实践¶
基础镜像选择¶
- 官方镜像:优先选择官方维护的基础镜像(如
python:3.9-slim
),以确保安全性和稳定性。 - 轻量化镜像:使用
-slim
或-alpine
版本的基础镜像,以减少镜像体积。 - 多架构支持:选择支持多架构(如
arm64
、amd64
)的基础镜像,以兼容不同的硬件平台。 - 使用最小化基础镜像:选择轻量化的基础镜像(如
alpine
或slim
),以减少镜像体积。 - 避免使用
latest
标签:明确指定镜像版本,以避免因基础镜像更新导致的兼容性问题。 - 定期更新基础镜像:定期更新基础镜像以获取安全补丁和新功能。
精简基础镜像¶
选择合适的基础镜像是优化 Docker 镜像的第一步。Alpine Linux 是一个流行的轻量级基础镜像,它的大小只有几 MB,远小于其他常见的 Linux 发行版。此外,您还可以通过移除不必要的依赖包来进一步减小镜像体积。
镜像构建优化¶
减少镜像层数¶
Docker 镜像由多个只读层组成,每个指令都会生成一个新的层。通过合并多个 RUN
指令,可以减少镜像层数,从而降低镜像体积。
# 不推荐
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
# 推荐
RUN apt-get update && \
apt-get install -y curl git && \
rm -rf /var/lib/apt/lists/*
清理缓存和临时文件¶
在安装依赖后,及时清理缓存和临时文件,以减少镜像体积。
使用 .dockerignore
文件¶
通过 .dockerignore
文件排除不必要的文件,避免它们被复制到镜像中。
使用 COPY¶
- 使用
COPY
替代ADD
:COPY
指令比ADD
更简单,且不会自动解压文件,因此更适合用于复制文件。
多阶段构建¶
多阶段构建是一种有效的优化策略,它允许您在构建过程中使用多个临时镜像,最终只将运行应用所需的文件和依赖打包进最终镜像。
# 第一阶段:构建应用
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 第二阶段:运行应用
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
构建性能加速¶
利用缓存机制¶
Docker 在构建镜像时会缓存每一层的构建结果。合理安排 Dockerfile 指令的顺序可以充分利用这一缓存机制,从而加速构建过程。
安全扫描¶
使用镜像扫描工具¶
镜像扫描工具可以帮助您识别镜像中的安全漏洞和依赖项问题。常用的工具包括 Trivy
和 Clair
。