多阶段构建是优化云原生CI流水线性能最直接有效的手段,通过分离构建与运行环境实现镜像精简、缓存复用、安全提效及工具链协同。
多阶段构建是优化云原生 ci 流水线性能最直接有效的手段之一,核心在于分离构建环境与运行环境,减少镜像体积、复用缓存层、规避敏感依赖暴露,并加速构建反馈。
分层解耦:让构建和运行各司其职
传统单阶段构建会把编译工具链、测试框架、源码、依赖包全部打包进最终镜像,导致镜像臃肿、拉取慢、安全风险高。多阶段构建通过 AS 关键字定义多个构建阶段,只将必要产物(如 JAR、dist 目录)从构建阶段 COPY --from= 到精简的运行阶段。
- 构建阶段使用完整开发镜像(如
maven:3.8-openjdk-17或node:20),专注编译、测试、打包 - 运行阶段切换为轻量基础镜像(如
eclipse-temurin:17-jre-alpine或nginx:alpine),仅含运行时依赖 - 最终镜像体积通常可压缩至原来的 1/3~1/5,显著降低 registry 存储压力与集群拉取耗时
缓存复用:聚焦不变层,跳过重复计算
Docker 构建缓存按指令逐行比对,只要某一层输入未变,后续层即可复用。多阶段构建天然支持“分段缓存”:
-
COPY pom.xml .和RUN mvn dependency:go-offline放在构建阶段靠前位置,只要依赖没变,整个依赖下载层就可长期复用 - 源码变更(
COPY src ./src)只影响其后指令,不影响前置的依赖层和基础镜像层 - GitLab CI 等平台能自动缓存各阶段中间镜像,配合
--cache-from可跨流水线复用历史构建结果
安全提效:剔除构建工具,减少攻击面
最终镜像不包含 Maven、npm、Go SDK、编译器等构建工具,既符合不可变基础设施原则,也大幅缩小攻击面:
- 避免因构建工具漏洞(如 Log4j 在 maven-plugin 中的间接引用)污染运行时环境
- 静态扫描(如 Trivy)对精简镜像的扫描速度提升 2~3 倍,且误报率更低
- 满足金融、政务类场景对“最小运行时”的合规要求
适配云原生工具链:与 BuildKit 和 CI 平台深度协同
启用 Docker BuildKit 后,多阶段构建可进一步提速并增强可控性:
- 支持
RUN --mount=type=cache挂载构建缓存目录(如 Maven local repo),避免每次重下依赖 - GitLab CI 可一键开启 BuildKit:
DOCKER_BUILDKIT=1 docker build ...,无需额外插件 - 结合
.dockerignore排除node_modules、target、.git等非必要文件,减少上下文传输开销


















