Docker构建提速关键在于稳定每层缓存:先COPY依赖文件(如package.json)并安装,再COPY源码;用.dockerignore排除无关文件;固定基础镜像标签;启用BuildKit及cache挂载。

缓存不是“开了就快”,而是要让每一层都稳住。Docker 构建提速的关键,在于让耗时操作(比如依赖安装)不被日常代码修改反复触发——只要 package.json、go.mod 或 requirements.txt 没变,安装命令就该秒过。
把依赖和代码分开 COPY
这是最直接有效的缓存控制手段。把变动少的文件先复制、安装,再复制频繁变更的源码:
- COPY package.json /tmp/ && RUN npm ci --no-audit
- COPY requirements.txt /tmp/ && RUN pip install -r /tmp/requirements.txt
- COPY go.mod /tmp/ && RUN go mod download
这样改了 100 行 JS 或 Python 文件,也不会让 npm install 或 pip install 重跑。
用 .dockerignore 减少上下文干扰
Docker 默认把整个构建目录打包上传。如果里面混着 node_modules、.git、日志或临时文件,不仅传得慢,还会让 COPY . . 的哈希值天天变,缓存形同虚设。
在项目根目录加一个 .dockerignore,至少排除这几类:
- node_modules/、__pycache__/、target/ 等构建产物
- .git、.DS_Store、*.log、*.tmp
- IDE 配置目录(如 .vscode、.idea)
固定基础镜像标签,避免底层静默更新
写 FROM python:3.11-slim 比 FROM python:3.11 更可靠;FROM node:20-alpine 比 FROM node:20 更可控。标签越具体,基础镜像 ID 越稳定。一旦基础层变了,整条缓存链就断了——哪怕 Dockerfile 一行没动。
启用 BuildKit + cache mount 做本地依赖复用
BuildKit 是现代构建引擎,默认未开启。设置环境变量并改写 RUN 指令,能让 npm、pip、go 等工具复用本地缓存:
- 构建前执行:export DOCKER_BUILDKIT=1
- 在 Dockerfile 中写:# syntax=docker/dockerfile:1
- RUN --mount=type=cache,target=/root/.npm npm ci --prefer-offline
CI 场景下效果尤其明显:同一台构建机上多次运行,npm 包不用反复下载。


















