基于 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 参数、容器运行用户等,满足生产环境需求。
相关推荐
折哥的程序人生 · 物流技术专研3 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
GoGeekBaird3 小时前
从 Prompt Engineering 到 Loop Engineering,我觉得 AI 开发这事儿终于开始变味了
后端·github
一条泥憨鱼3 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【78】沙箱(Sandbox)
java·人工智能·spring
程序员二叉4 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
周航宇JoeZhou4 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察
好家伙VCC4 小时前
Web Components主题热切换方案揭秘
java·前端
慕木沐4 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Oneslide4 小时前
初始化微信小程序
后端
hboot5 小时前
AI工程师第一课 - Python
前端·后端·python