核心是让Docker复用已构建的中间层,而非重跑所有指令;需将低频操作前置、高频改动后置,先COPY依赖清单再安装,合并RUN指令清理中间产物,用.dockerignore和多阶段构建减少干扰,并启用BuildKit配合远程缓存。

核心是让 Docker 复用已构建的中间层,而不是每次重跑所有指令。只要某一层的输入没变(基础镜像、上层ID、命令文本、文件内容),它和之后所有可复用的层都会跳过执行。
把低频操作往前放,高频改动往后放
依赖清单(如 requirements.txt、package.json、go.mod)变动远少于源码。先单独 COPY 这些文件,再 RUN 安装或下载:
- COPY requirements.txt .
- RUN pip install --no-cache-dir -r requirements.txt
- COPY . .
这样改业务代码不影响依赖安装层;哪怕每天提交几十次,pip install 这一步仍能稳定命中缓存。
合并 RUN 指令并清理中间产物
每个 RUN 都生成新层,残留的 apt 缓存、临时文件、日志可能因时间戳或随机内容导致哈希变化,让缓存失效。
- ✅ 推荐写法:RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
- ✅ yum 系统:RUN yum makecache fast && yum install -y nginx && yum clean all
- 避免在 RUN 中调用 date、curl https://xxx/timestamp 这类动态命令
用 .dockerignore 和多阶段构建减少干扰
.dockerignore 能防止本地开发文件(如 .git、node_modules、__pycache__)被 COPY 进构建上下文,避免无意义的文件变更触发缓存断裂。
多阶段构建让各阶段缓存彼此隔离:
- builder 阶段的 RUN go build 缓存,不影响 runner 阶段的 COPY --from=builder
- 最终镜像不带编译工具、测试代码,体积更小,缓存更干净
启用 BuildKit 并接入远程缓存
本地缓存在 CI/CD 中基本无效——每次都是全新环境。启用 BuildKit 后,可用 --cache-from 和 --cache-to 把缓存推到镜像仓库:
- 构建前加:export DOCKER_BUILDKIT=1
- 命令示例:docker buildx build --cache-from type=registry,ref=myrepo/cache --cache-to type=registry,ref=myrepo/cache,mode=max -t myrepo/app:latest .
- CI 中需先 docker pull 缓存镜像(即使失败也忽略),否则 --cache-from 无法生效


















