跳转至

镜像构建最佳实践

基础镜像选择

  • 官方镜像:优先选择官方维护的基础镜像(如 python:3.9-slim),以确保安全性和稳定性。
  • 轻量化镜像:使用 -slim-alpine 版本的基础镜像,以减少镜像体积。
  • 多架构支持:选择支持多架构(如 arm64amd64)的基础镜像,以兼容不同的硬件平台。
  • 使用最小化基础镜像:选择轻量化的基础镜像(如 alpineslim),以减少镜像体积。
  • 避免使用 latest 标签:明确指定镜像版本,以避免因基础镜像更新导致的兼容性问题。
  • 定期更新基础镜像:定期更新基础镜像以获取安全补丁和新功能。

精简基础镜像

选择合适的基础镜像是优化 Docker 镜像的第一步。Alpine Linux 是一个流行的轻量级基础镜像,它的大小只有几 MB,远小于其他常见的 Linux 发行版。此外,您还可以通过移除不必要的依赖包来进一步减小镜像体积。

FROM alpine:latest
RUN apk add --no-cache python3

镜像构建优化

减少镜像层数

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/*

清理缓存和临时文件

在安装依赖后,及时清理缓存和临时文件,以减少镜像体积。

RUN apt-get update && \
    apt-get install -y curl && \
    rm -rf /var/lib/apt/lists/*

使用 .dockerignore 文件

通过 .dockerignore 文件排除不必要的文件,避免它们被复制到镜像中。

# .dockerignore 示例
node_modules
.git
*.log

使用 COPY

  • 使用 COPY 替代 ADD COPY 指令比 ADD 更简单,且不会自动解压文件,因此更适合用于复制文件。
COPY . /app

多阶段构建

多阶段构建是一种有效的优化策略,它允许您在构建过程中使用多个临时镜像,最终只将运行应用所需的文件和依赖打包进最终镜像。

# 第一阶段:构建应用
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 指令的顺序可以充分利用这一缓存机制,从而加速构建过程。

# 先安装依赖,再复制代码
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

安全扫描

使用镜像扫描工具

镜像扫描工具可以帮助您识别镜像中的安全漏洞和依赖项问题。常用的工具包括 TrivyClair

trivy image myimage:latest