首页/云/Docker 容器速查/image 与 build 字段的配合
Compose 编排55 条

image 与 build 字段的配合

image 指定镜像名(拉取或命名构建产物),build 指定构建上下文;两者共存时构建出的镜像以 image 命名,方便直接 push。

Docker 容器速查云更新于 2026-10-13

image 与 build 怎么配合

image 指定镜像名与标签,可以是拉取来源,也可以是构建产物的命名;build 指定构建上下文与 Dockerfile。两者同时出现时,Compose 会先构建,再按 image 的名字给结果打标签,这样构建产物可以直接推送,编排里也能引用固定版本。

基本信息

image镜像名与标签,如 registry.example.com/team/app/api:1.4.2
buildcontext、dockerfile、args、target 等构建参数
共存行为构建结果按 image 指定的名字打标签
只写 image直接拉取,不执行构建
构建参数args 会记录进镜像元数据,不要用来传凭据

典型使用场景

  • 同一份文件兼顾开发与生产:开发环境保留 build,生产环境用覆盖文件只留 image
  • 构建即推送:docker compose build 后 docker compose push 推到私有仓库
  • CI 里构建并推镜像,部署机只做拉取,不必保留 Dockerfile
  • 多阶段构建选择目标阶段:用 build.target 只产出运行阶段
  • 排查“改了代码容器却没变”:确认该服务到底走构建还是拉取
  • 本地复现线上镜像:用同样的 tag 与构建参数重建,减少环境差异

示例

示例
services:
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
      target: runtime                 # 多阶段里只构建到运行阶段
      args:
        APP_VERSION: "1.4.2"          # 构建参数,切勿放凭据
    image: registry.example.com/team/app/api:1.4.2   # 构建结果的命名与推送目标

两种写法组合后的行为

写法实际行为适用场景
只写 image直接拉取镜像生产部署,镜像来自仓库
只写 build构建并生成镜像本地开发
两者都写先构建,结果按 image 命名构建与推送一体,CI 常见
build 带 target只构建到指定阶段调试或分阶段产出
build 带 cache_from构建时复用外部缓存CI 提速
只写 image 时 Compose 不会构建:本地改了 Dockerfile 却不生效,通常就是少了 build 字段,或者根本走了另一份覆盖文件。
build.context 决定哪些文件能被 COPY 使用,路径写错会构建出与预期不一致的镜像,构建日志里的上下文文件列表能提前暴露问题。
构建参数只影响构建过程,运行期配置要用 environment 或挂载文件,两类参数分开管,排查时不容易混淆。

易错点

  • 以为写了 build 就会自动重建:up 默认复用已有镜像,改动后要 docker compose build 或 up --build
  • 把口令放进构建参数,值会记录在镜像历史里,改用 secret 挂载传递
  • 构建端与拉取端用了不同 tag,部署机上拿到的是旧镜像,固定版本号并核对镜像摘要更稳妥
  • 构建上下文写成仓库根目录,无关文件全部传给构建器,构建变慢,还可能把敏感文件带进镜像

数据来源与参考

  • Docker 官方文档:Compose build 参考(docs.docker.com/reference/compose-file/build)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌