基于 Jib 实现无 Dockerfile 的 Spring Boot 应用容器化

在本文中,我们将深入探讨 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 的核心优势

  1. 无需编写 Dockerfile:Jib 会全权处理容器构建的全流程,无需手动编写 Dockerfile。
  2. 构建速度快:Jib 将应用拆分为依赖层、资源层、代码层等独立分层,仅重新构建发生变更的分层,实现快速增量构建。
  3. 构建可复现:基于声明式构建元数据,只要输入内容不变,Jib 就能生成字节级完全一致的容器镜像。
  4. 无守护进程依赖:构建镜像无需运行 Docker 守护进程,简化 CI/CD 环境配置并提升安全性。
  5. 默认安全加固: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 上。

参考资料

  1. Jib 官方仓库:https://github.com/GoogleContainerTools/jib
  2. Google 云平台博客:https://cloudplatform.googleblog.com/2018/07/introducing-jib-build-java-docker-images-better.html
  3. Jib Maven 插件版本库:https://mvnrepository.com/artifact/com.google.cloud.tools/jib-maven-plugin

关键点回顾

  1. Jib 是 Google 开源的 Java 应用容器化工具,核心优势是无 Dockerfile、增量构建、可复现构建且默认安全;
  2. 集成 Jib 最便捷的方式是通过 Maven/Gradle 插件,基础使用仅需配置镜像名称即可;
  3. Jib 支持丰富的自定义配置,包括基础镜像、JVM 参数、容器运行用户等,满足生产环境需求。
相关推荐
Maiko Star5 小时前
Spring AI ChatClient 完全指南:从基础配置到流式调用
java·人工智能·spring
l1t6 小时前
类似 X-13ARIMA-SEATS 功能的 JDemetra+ 安装和使用
java·数据库·r语言
架构源启6 小时前
2026 进阶篇:深入理解Spring Reactor响应式编程的核心引擎(源码级解析+实战避坑)
java·后端·spring
用户962377954486 小时前
Ghost Bits:高位截断如何让 Java WAF 形同虚设
后端
薪火铺子6 小时前
SpringMVC请求处理流程源码解析(第2篇):处理器执行与参数绑定
java·后端·spring
SamDeepThinking6 小时前
一个跑了三年没出过问题的系统,我是怎么设计的
java·后端·架构
写了20年代码的老程序员6 小时前
做接口开发最烦的,不是 JSON 深,而是它打断你思考业务
后端
逸Y 仙X6 小时前
文章十七:ElasticSearch get\search查询相关参数
java·大数据·elasticsearch·搜索引擎·全文检索
Walter先生6 小时前
Python 行情数据清洗实战:Z-Score、MAD 与分位数过滤的异常值检测
后端·websocket·架构·实时行情数据源·美股行情api