通过合理组织Dockerfile指令顺序、多阶段构建、BuildKit缓存挂载及精简构建上下文,可大幅提升镜像构建速度。
靠合理组织构建流程和利用 docker 的层缓存机制,就能在重新构建时显著提速。核心不是“加功能”,而是让 docker 少做重复工作。
把稳定操作放前面,变动操作放后面
Docker 缓存按顺序逐层检查:只有当前指令内容没变,且它上面所有层都命中缓存,这一层才能复用。一旦某层失效,后续全部重来。
- 先 COPY 依赖文件(如 package.json、go.mod、requirements.txt),再 RUN 安装命令 —— 这样只要依赖没改,安装步骤就直接跳过
- 最后 COPY 源码或构建产物 —— 代码天天改,放最后才不会连累前面的缓存
- 避免
COPY . /app这种全量复制,它会让每次 git commit 都触发整条链重跑
用多阶段构建隔离耗时操作
把编译、打包、测试等重活放在独立阶段,只把最终产物复制到精简的运行镜像里。这样即使运行镜像变了,构建阶段的缓存仍可复用。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- Go 项目中,
go mod download和go build分开两步,前者只在go.sum变时才重跑 - 前端项目里,
npm ci和npm run build放 builder 阶段,产出的dist/再 COPY 到 nginx 镜像 - 命名阶段(如
AS builder)方便跨阶段引用,也利于 CI 中缓存复用
启用 BuildKit 并配置缓存挂载
BuildKit 是现代 Docker 构建引擎,默认开启后支持更智能的缓存管理,尤其适合 CI 场景。
- 构建前加
export DOCKER_BUILDKIT=1,或用docker buildx build - 对 npm/yarn/pip 等工具,用
--mount=type=cache,target=/root/.npm把包缓存目录挂载为持久卷,不随镜像打包,也不受构建机切换影响 - 配合远程缓存(如
--cache-to type=registry,ref=my-registry/cache:build),不同流水线节点也能共享缓存
精简构建上下文,避免缓存被意外破坏
构建上下文(build context)是发送给 Docker daemon 的整个文件集合。里面混进无关文件,不仅拖慢传输,还会让 COPY 指令因哈希变化而失效。
- 写好
.dockerignore:排除node_modules、.git、logs、*.log、dist/、target/等 - 基础镜像别用
latest,固定标签如python:3.11-slim或node:20-alpine,防止上游更新导致缓存断裂 - CI 中启用构建缓存存储(如 GitHub Actions 的
docker/setup-buildx-action+ cache step)

















