# 优化 Docker 镜像:高效构建的最佳实践

发布: (2025年12月2日 GMT+8 06:04)
5 min read
原文: Dev.to

Source: Dev.to

介绍

Docker 镜像是容器化应用的基础。庞大且低效的镜像会导致构建变慢、部署时间更长以及存储使用增加。优化镜像可以实现更快的交付、更好的性能以及更低的资源消耗。

大而低效的镜像对部署的影响

沉重的镜像会占用更多磁盘空间,并增加网络传输时间,这在 CI/CD 流水线和云端部署中尤为关键。高效的镜像使操作更加敏捷,降低运营成本。

1. 使用 Slim 基础镜像

选择最小化镜像(Alpine、Slim 变体)

从最小化或 “slim” 的基础镜像开始,以减少多余的包。例如,别使用 python:3.10,可以考虑 python:3.10-slimalpine。最小化镜像会移除不必要的包和库,从而得到更小、更安全的镜像。

减少不必要的依赖

仅安装应用真正需要的包和库。避免在运行时镜像中包含构建工具或文档文件。

在体积与功能之间取得平衡

虽然 slim 镜像体积小,但某些应用可能需要特定的库。选择既能满足功能需求又能保持体积较小的基础镜像,避免运行时错误。

2. 多阶段构建(Multi‑Stage Builds)

什么是多阶段构建

多阶段构建允许将构建环境与运行时环境分离。这种技术可以在一个阶段中包含编译工具,而只将最终产物复制到最终镜像,从而大幅降低镜像体积。

分离构建环境和运行时环境

阶段 1: 使用所有必要的依赖编译或构建应用。
阶段 2: 仅将最终产物复制到更小的基础镜像中,丢弃构建工具和中间文件。

实际示例(Node.js + pnpm)

FROM node:22-alpine AS base

WORKDIR /app

COPY package*.json pnpm-lock.yaml* ./

RUN npm install -g pnpm \
    && pnpm install --frozen-lockfile

EXPOSE 3000

CMD ["pnpm", "run", "dev"]

Python Slim 多阶段示例

FROM python:3.12-slim

ENV PYTHONPATH=/app

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir --upgrade -r requirements.txt

COPY alembic.ini .
COPY ./entrypoint.sh .
COPY . .

EXPOSE 8000

ENTRYPOINT ["./entrypoint.sh"]
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

3. Docker 层如何影响镜像体积

Dockerfile 中的每条指令(RUNCOPYADD)都会创建一层。大量小层会增加镜像的总体积。将相关命令合并到同一个 RUN 中,以减少层数:

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

始终在同一个 RUN 命令中删除缓存和临时文件;否则它们会保留在前面的层中,导致最终体积增大。

4. 使用 .dockerignore 进行优化

.dockerignore 文件可以阻止不必要的文件被发送到构建上下文。

node_modules
.next
.tests
__pycache__
__pytest__
builds/
venv
logs

这会显著减少发送给 Docker 的上下文大小,加快构建速度,避免产生不必要的层。

5. 高效利用缓存

通过先复制依赖文件来利用 Docker 缓存。

对于 Node

COPY package.json pnpm-lock.yaml ./
RUN pnpm install

对于 Python

COPY requirements.txt .
RUN pip install -r requirements.txt

只有在依赖文件真正变化时,才会重新处理这些步骤。

6. 通用最佳实践

  • 使用 DOCKER_TAG=1.0.0IMAGE_VERSION=1.0.0 等标签来追踪版本,避免构建之间的混淆。
  • 定期使用 docker image ls 进行审计并删除旧镜像。
  • 在 CI/CD 流水线中集成优化步骤,确保构建一致、体积更小、速度更快。
  • 避免在生产镜像中包含测试工具和文档。
  • 尽可能优先使用最小化镜像。

结论

采纳这些最佳实践可以提升应用性能,降低运营成本,并为现代可扩展环境提供紧凑高效的镜像。多阶段构建、使用 slim 镜像、清理层以及 .dockerignore 是创建高性能、易维护镜像的关键支柱。

Back to Blog

相关文章

阅读更多 »

Jenkins 在 AWS + Docker

Jenkins 在 AWS + Docker 的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-upload...