--target 是什么
多阶段构建里用 --target 指定只构建到某个阶段为止:适合调试中间产物、在 CI 里单独构建依赖阶段,或产出只含编译结果的中间镜像。被选阶段之后的所有阶段都不会执行,构建更快。
基本信息
| 用途 | 选择构建到哪个阶段为止 |
|---|---|
| 语法 | docker build --target 阶段名 -t 名称 . |
| 默认行为 | 构建全部阶段,结果取最后一个阶段 |
| 定位方式 | 阶段名(AS 声明)或阶段序号 |
| 注意事项 | 中间阶段的产物通常不是可直接发布的镜像 |
典型使用场景
- 调试构建环境:只构建到 build 阶段,进容器看依赖是否齐全
- CI 分层构建:依赖阶段单独构建并复用,缩短后续构建时间
- 排查运行阶段缺文件:先构建到中间阶段,确认产物确实生成
- 产出测试阶段镜像,跑完接口测试再继续后续发布流程
- 为不同角色复用同一份文件:停在某个阶段得到不同的产物
- 加快日常构建:开发时只构建到当前需要的阶段
示例
示例
docker build --target build -t app/web:build . # 只构建到构建阶段
docker build --target runtime -t app/web:runtime . # 构建到运行阶段
docker run --rm -it app/web:build sh # 进中间镜像排查依赖
docker build --target 0 -t app/web:first . # 也可以用阶段序号几种目标选择
| 写法 | 含义 | 适用情况 |
|---|---|---|
| 不指定 target | 构建全部阶段 | 正常发布流程 |
| --target build | 只构建到 build 阶段 | 调试依赖与编译环境 |
| --target runtime | 只构建到运行阶段 | 跳过后续可选阶段 |
| --target 序号 | 按阶段序号定位 | 阶段没有命名时使用 |
停在中间阶段得到的是未完成镜像,直接运行可能缺少运行环境,不要把它当作发布镜像使用。
阶段名拼写错误时的报错可能指向依赖关系而不是名字本身,先核对 AS 声明里的写法与大小写。
用 --target 做 CI 分层能明显缩短构建时间,前提是各阶段依赖关系清晰、缓存配置到位。