多阶段构建的核心是分离构建与运行环境,通过多个from指令在单个dockerfile中实现镜像瘦身、环境一致和安全加固;支持--target分步调试、统一构建逻辑、差异化交付,并天然适配kubernetes与serverless平台。

多阶段构建在自动化部署中,核心是把“怎么构建”和“怎么运行”彻底分开,让 CI/CD 流水线只产出轻量、安全、可复现的生产镜像。
用在 CI/CD 流水线里直接生成精简镜像
在 GitLab CI、GitHub Actions 或 Jenkins 中,只需执行 docker build,Docker 就会按 Dockerfile 里的多个 FROM 阶段自动执行:先拉取构建镜像、编译打包,再切换到运行镜像、复制产物。整个过程无需人工干预,也不依赖本地环境。
- 构建阶段(如 Maven/Node.js)跑在带完整工具链的镜像里,确保编译成功
- 运行阶段(如 Alpine/JRE-alpine)不装任何编译器,只放二进制或 jar 包
- 最终推送的镜像体积小、启动快、漏洞少,天然适配 Kubernetes 和 Serverless 平台
配合 --target 做分步调试和灰度验证
可以在 Dockerfile 中给不同阶段命名(如 AS builder、AS tester),然后在流水线里用 --target 指定构建某一段:
-
docker build --target builder -t myapp:build .→ 只构建并缓存编译环境,用于快速验证依赖是否下载成功 -
docker build --target tester -t myapp:test .→ 单独跑单元测试或集成测试,不生成最终镜像 -
docker build -t myapp:prod .→ 默认构建到最后阶段,用于正式发布
这样既避免每次全量构建浪费资源,又能对关键环节做独立质量门禁。
统一构建逻辑,消除环境差异
传统方式常在 CI 脚本里写一堆 npm install、mvn package、cp target/*.jar,容易因 shell 版本、路径或权限出错。而多阶段构建把所有步骤固化在 Dockerfile 中:
- 构建命令(如
RUN npm run build)和运行命令(如CMD ["nginx", "-g", "daemon off;"])都在同一份声明式文件里 - CI 脚本只需一行
docker build -t $IMAGE_NAME .,语义清晰、易审计、可版本化管理 - 开发、测试、生产用的构建逻辑完全一致,不再出现“本地能跑,CI 报错”
支持差异化交付,比如前端+后端混合打包
一个项目常含多个服务组件,多阶段构建可灵活组合输出:
- 前端项目:第一阶段用
node:18构建dist,第二阶段用nginx:alpine托管静态文件 - 后端 API:第一阶段用
maven:3.9打包 jar,第二阶段用eclipse-temurin:17-jre-alpine运行 - 还能加第三阶段:用
scratch或distroless镜像进一步裁剪,连 shell 都不带,专供高安全场景
这些阶段可共用一套基础配置,也可按需启用,让一次提交触发多种制品输出。











