You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Maven Jib插件分阶段构建推送容器镜像且避免重复构建?

解决Maven Jib分阶段构建并推送镜像的方案

不用重复配置插件,也无需依赖缓存机制来规避重复构建,Jib本身支持拆分构建和推送步骤,核心思路是先在compile阶段生成镜像的构建上下文与缓存内容,再在deploy阶段复用这些内容完成推送,具体实现方式如下:

核心配置步骤

在pom.xml中给Jib插件配置两个execution,分别绑定到compile和deploy阶段,通过参数区分不同阶段的行为:

<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>3.4.0</version> <!-- 使用最新稳定版本 -->
  <executions>
    <!-- 第一步:compile阶段完成镜像构建,仅写入本地缓存不推送 -->
    <execution>
      <id>build-to-cache</id>
      <phase>compile</phase>
      <goals>
        <goal>build</goal>
      </goals>
      <configuration>
        <to>
          <image>your-registry/your-image:temp-build</image>
          <auth>
            <username>${registry.username}</username>
            <password>${registry.password}</password>
          </auth>
        </to>
        <!-- 启用缓存模式,将镜像层写入本地缓存 -->
        <containerizingMode>cached</containerizingMode>
      </configuration>
    </execution>
    <!-- 第二步:deploy阶段复用缓存,直接推送最终镜像 -->
    <execution>
      <id>push-from-cache</id>
      <phase>deploy</phase>
      <goals>
        <goal>build</goal>
      </goals>
      <configuration>
        <to>
          <image>your-registry/your-image:${project.version}</image>
          <auth>
            <username>${registry.username}</username>
            <password>${registry.password}</password>
          </auth>
        </to>
        <!-- 从之前构建的临时镜像缓存读取内容,跳过重新构建 -->
        <from>
          <image>your-registry/your-image:temp-build</image>
        </from>
        <containerizingMode>cached</containerizingMode>
      </configuration>
    </execution>
  </executions>
</plugin>

关键细节说明

  • containerizingMode设为cached是核心:Jib会把构建生成的镜像层缓存到本地~/.cache/jib目录,后续推送时直接复用这些缓存,不会重新编译打包应用。
  • 也可以选择将第一阶段的构建输出到本地Docker镜像(把<to>配置为docker-daemon:your-image:temp-build),第二阶段直接从本地Docker镜像推送,这种方式更直观,适合本地调试场景。

简化参数控制方案

如果不想拆分execution,也可以通过Maven命令参数分两步执行:

  • 执行mvn compile jib:build完成本地镜像构建与缓存写入
  • 执行mvn deploy jib:build -Djib.to.image=your-registry/your-image:${project.version} -Djib.containerizingMode=cached,此时Jib会直接复用缓存内容完成推送

内容的提问来源于stack exchange,提问作者houssam zeineddine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:17:31