慢构建的根因

很多项目 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

小结

镜像构建优化不是玄学,核心就三点:

  1. 层次顺序
  2. 缓存挂载
  3. CI 缓存复用

把这三点做好,开发反馈速度会提升一个量级。