docker镜像构建提速的核心是优化缓存复用:①依赖与代码分离,先copy清单再安装;②合并run指令并及时清理临时文件;③善用.dockerignore和多阶段构建;④启用buildkit配合远程缓存。

Docker 镜像构建提速,核心不是拼硬件或换网络,而是让缓存真正“用得上、命中准、复用稳”。
把依赖安装和代码分开处理
Docker 缓存按层生效,一旦某层变了,后面所有层都得重做。所以关键动作是:先复制依赖清单(如 requirements.txt、package.json 或 pom.xml),再执行安装命令。
- ✅ 正确顺序:
COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . .
- ❌ 错误顺序(改一行代码就重装所有包):
COPY . . RUN pip install --no-cache-dir -r requirements.txt
这样只要 requirements.txt 不变,pip install 这一层就能稳定复用,哪怕你每天改几十次业务代码,也不影响依赖安装环节。
合并 RUN 指令并及时清理
每个 RUN 都生成新层,中间产生的临时文件(比如 apt 缓存、下载包、日志)若没清理,不仅增大镜像体积,还可能因时间戳或随机内容导致缓存失效。
- 推荐写法(一条指令完成更新、安装、清理):
RUN apt-get update && apt-get install -y curl jq && rm -rf /var/lib/apt/lists/*
- 对于 yum 系统(CentOS/RHEL):
RUN yum makecache fast && yum install -y nginx && yum clean all
yum makecache fast提前拉取元数据,实测可将构建时间从 2.5 分钟压到 45 秒;yum clean all则避免缓存进镜像。
善用 .dockerignore 和多阶段构建
.dockerignore 不只是省传输时间,更是保护缓存的关键防线。它能防止 node_modules、.git、本地配置等无关文件被意外 COPY 进来,触发整层重建。
- 示例
.dockerignore:node_modules .git __pycache__ *.log Dockerfile .dockerignore
多阶段构建则把编译环境和运行环境彻底隔离:
FROM golang:1.21 AS builder WORKDIR /src COPY go.mod . RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o app . FROM alpine:latest COPY --from=builder /src/app . CMD ["./app"]
go mod download 阶段可独立缓存——依赖不变时,即使源码天天改,这一层也永远复用。
启用 BuildKit 并配合远程缓存
本地层缓存只在单机或同分支下有效。CI/CD 中要跨机器、跨分支复用,得靠 --cache-from + BuildKit:
- 构建时加参数:
DOCKER_BUILDKIT=1 docker build \ --cache-from type=registry,ref=my-registry/app:buildcache \ --cache-to type=registry,ref=my-registry/app:buildcache \ -t my-registry/app:latest .
- 它支持挂载缓存目录(比如 pip 的
~/.cache/pip),让包下载也能复用,进一步压缩首次构建之外的耗时。
不复杂但容易忽略











