在本文中,我们将深入探讨 Jib 的工作原理、它与传统 Docker 构建方式的差异,以及如何使用 Jib 在不编写 Dockerfile 的前提下,为 Spring Boot 应用完成容器化构建。
先决条件
完成本文实操需要满足以下环境要求:
- Spring Boot 3
- Maven 3.6.3 或更高版本
- Java 21
- IntelliJ IDEA、Visual Studio Code 或其他 Java 开发 IDE
概述
什么是 Jib?
Jib 是由 Google 开发的开源工具,专为 Java 应用构建优化的容器镜像设计。其核心特性包括:
- 无需编写 Dockerfile
- 无需 Docker 守护进程(除非需要推送到本地 Docker 仓库)
- 针对 Java 制品优化的分层镜像构建
- 快速增量构建
- 可复现构建(字节级完全一致的镜像)
- 基于安全基础镜像且支持自动更新
- 提供 Maven/Gradle 插件及 Java 库两种使用形式
Jib 的工作原理
传统方式下,Java 应用会被构建为包含完整应用 JAR 包的单一镜像层;而 Jib 的构建策略则将 Java 应用拆分为多个分层,实现更细粒度的增量构建 ------ 当代码发生变更时,仅重新构建变更的层,而非整个应用。默认情况下,这些分层会基于 OpenJDK 基础镜像构建,你也可以配置自定义基础镜像。

Jib 的核心优势
- 无需编写 Dockerfile:Jib 会全权处理容器构建的全流程,无需手动编写 Dockerfile。
- 构建速度快:Jib 将应用拆分为依赖层、资源层、代码层等独立分层,仅重新构建发生变更的分层,实现快速增量构建。
- 构建可复现:基于声明式构建元数据,只要输入内容不变,Jib 就能生成字节级完全一致的容器镜像。
- 无守护进程依赖:构建镜像无需运行 Docker 守护进程,简化 CI/CD 环境配置并提升安全性。
- 默认安全加固:Jib 默认基于「无发行版(distroless)Java 镜像」构建,这是一种极简的操作系统镜像,仅包含应用及其运行时依赖 ------ 无 Shell、无包管理器,大幅降低攻击面。
基于 Jib + Maven 实现 Spring Boot 应用容器化
我们先从 start.spring.io 创建一个简单的 Spring Boot 项目,添加 Spring Web 依赖即可。本文以 Maven 为例(Gradle 操作流程类似)。
第一步:编写基础 REST 接口
首先实现一个简单的 REST 接口,用于验证容器化后的应用是否正常运行:
java
@RestController
@RequestMapping("/api")
@SpringBootApplication
public class SpringBootJibApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootJibApplication.class, args);
}
@GetMapping
public String index() {
return "Greetings: Spring Boot Containerization Using Jib!";
}
}
访问该接口时,会返回一段包含问候语的纯文本响应(原文此处描述略有笔误,实际返回固定字符串,译文保持代码逻辑一致性)。
第二步:引入 Jib Maven 插件
只需在项目的 pom.xml 中添加 Jib Maven 插件即可快速上手,无需额外配置:
java
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<to>
<!-- 必选配置:指定构建后的目标镜像名称 -->
<image>spring-boot-jib</image>
</to>
</configuration>
</plugin>
你可以在Maven 仓库查看插件的最新版本。
第三步:构建容器镜像
方式 1:构建并推送至远程镜像仓库
若要将镜像直接构建并推送到 Docker Hub、GCR(Google 容器仓库)等远程镜像仓库,需先完成仓库的身份认证,再执行以下命令:
mvn compile jib:build
方式 2:构建到本地 Docker 仓库
Jib 也支持将镜像直接构建到本地 Docker 守护进程中(需确保 docker 命令已加入系统 PATH):
mvn compile jib:dockerBuild
该命令需要 Docker 处于运行状态,但依然无需编写任何 Dockerfile。

构建完成后,即可像运行普通 Docker 镜像一样启动容器:
docker run -p 8080:8080 spring-boot-jib:latest
此时访问接口,能正常返回响应,说明容器化构建成功。
高级配置
Jib 支持开箱即用,同时也提供了丰富的自定义配置项。以下是 pom.xml 中<configuration>节点内的常见自定义配置示例:
1. 自定义基础镜像
<from>
<!-- 使用官方Eclipse Temurin JRE作为基础镜像 -->
<image>eclipse-temurin:17-jre</image>
</from>
2. 设置 JVM 参数
<container>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xdebug</jvmFlag>
</jvmFlags>
</container>
3. 配置容器端口 / 环境变量 / 运行用户
<configuration>
<container>
<!-- 暴露容器端口 -->
<ports>
<port>8080</port>
</ports>
<!-- 设置环境变量 -->
<environment>
<SPRING_PROFILES_ACTIVE>prod</SPRING_PROFILES_ACTIVE>
</environment>
<!-- 指定容器运行用户ID -->
<user>1000</user>
</container>
</configuration>
所有可用配置项可参考Jib 官方文档。
总结
🎉 恭喜!本文详细讲解了如何通过 Jib 让 Spring Boot 开发者无需编写 Dockerfile 即可完成容器镜像构建。
Jib 将容器构建流程嵌入到 Maven/Gradle 构建生命周期中,为 Java 应用容器化提供了优雅的解决方案。这种「无 Dockerfile」的构建模式带来了显著优势:更快的构建速度、更强的安全性,以及更高的构建可复现性。
完整示例代码已托管在 GitHub 上。
参考资料
- Jib 官方仓库:https://github.com/GoogleContainerTools/jib
- Google 云平台博客:https://cloudplatform.googleblog.com/2018/07/introducing-jib-build-java-docker-images-better.html
- Jib Maven 插件版本库:https://mvnrepository.com/artifact/com.google.cloud.tools/jib-maven-plugin
关键点回顾
- Jib 是 Google 开源的 Java 应用容器化工具,核心优势是无 Dockerfile、增量构建、可复现构建且默认安全;
- 集成 Jib 最便捷的方式是通过 Maven/Gradle 插件,基础使用仅需配置镜像名称即可;
- Jib 支持丰富的自定义配置,包括基础镜像、JVM 参数、容器运行用户等,满足生产环境需求。