慢构建的根因
很多项目 Docker 构建慢,不是机器不够快,而是缓存命中策略有问题:
- 频繁变动的文件放在前面导致层失效
- 依赖下载每次重来
- 多阶段构建没有复用中间层
先调整 Dockerfile 顺序
典型 Node 项目可参考:
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
先拷贝依赖清单再安装,能最大化命中缓存层。
用 BuildKit 缓存挂载
RUN --mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg/mod \
go build -o app ./cmd/server
这类挂载尤其适合 Go/Rust 的依赖与编译缓存。
CI 中的实践
- 使用远程缓存导入导出
- 主分支构建作为缓存热源
- 避免无意义的
--no-cache
小结
镜像构建优化不是玄学,核心就三点:
- 层次顺序
- 缓存挂载
- CI 缓存复用
把这三点做好,开发反馈速度会提升一个量级。