1. 概述
本文将带你了解 Jib 是什么,以及它是如何简化 Java 应用的容器化流程的。
我们会拿一个简单的 Spring Boot 项目作为例子,使用 Jib 来构建它的 Docker 镜像,并将其推送到远程镜像仓库中。
如果你对传统方式(如使用 Dockerfile 和 docker 命令)来打包 Spring Boot 应用感兴趣,可以参考我们的另一篇文章:使用 Dockerfile 容器化 Spring Boot 应用。
2. Jib 简介
Jib 是 Google 开源的一个 Java 工具,专门用于构建 Java 应用的 Docker 镜像。它最大的优势在于:
✅ 不需要写 Dockerfile
✅ 甚至不需要本地安装 Docker
Jib 提供了 Maven 和 Gradle 插件两种形式,这意味着你可以将它无缝集成进你的构建流程中。每次构建项目时,Jib 会自动感知代码变更并构建新的镜像,省去了手动执行 docker build 和 docker push 的麻烦,非常适合集成进 CI/CD 流程。
市面上也有其他类似的工具,比如 Spotify 的 docker-maven-plugin 和 dockerfile-maven。不过前者已经不再维护,后者仍需依赖 Dockerfile。
3. 一个简单的问候应用
我们先准备一个简单的 Spring Boot 项目,它会暴露一个 GET 接口:
http://localhost:8080/greeting
使用 Spring MVC 实现如下:
@RestController
public class GreetingController {
private static final String template = "Hello Docker, %s!";
private final AtomicLong counter = new AtomicLong();
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(value="name",
defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
4. 准备部署环境
在本地部署前,我们需要配置好访问目标镜像仓库的认证信息。
以 DockerHub 为例,我们将认证信息配置在 ~/.m2/settings.xml
中:
<servers>
<server>
<id>registry.hub.docker.com</id>
<username>your-dockerhub-username</username>
<password>your-dockerhub-password</password>
</server>
</servers>
当然,更推荐的方式是使用认证助手工具,例如 docker-credential-helpers,将凭证加密存储在本地,而不是明文写在 settings.xml 中。不过本文为了演示方便,采用的是简单直接的方式。
5. 使用 Jib 部署到 Docker Hub
我们可以使用 jib-maven-plugin
(或 Gradle 插件)通过一条命令完成镜像构建与推送:
mvn compile com.google.cloud.tools:jib-maven-plugin:2.5.0:build -Dimage=$IMAGE_PATH
其中 $IMAGE_PATH
表示目标镜像在仓库中的路径。
例如,将镜像 baeldungjib/spring-jib-app
推送到 DockerHub:
export IMAGE_PATH=registry.hub.docker.com/baeldungjib/spring-jib-app
执行后,Jib 会自动构建镜像并推送到 DockerHub。
当然,你也可以类似地将镜像推送到 Google Container Registry 或 Amazon Elastic Container Registry。
6. 简化 Maven 命令
为了简化命令行操作,我们可以把插件配置写入 pom.xml
文件中:
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.0</version>
<configuration>
<to>
<image>${image.path}</image>
</to>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>
配置完成后,我们只需要执行:
mvn compile jib:build
就可以完成镜像构建和推送,简单粗暴!
7. 自定义 Docker 配置
默认情况下,Jib 会自动推断基础镜像(FROM)和入口命令(ENTRYPOINT)等配置。
但我们可以根据需要进行自定义。
比如,Spring Boot 默认监听 8080 端口,但我们想改为 8082,并让容器暴露这个端口:
<configuration>
...
<container>
<ports>
<port>8082</port>
</ports>
</container>
</configuration>
再比如,我们想更换基础镜像。Jib 默认使用 Eclipse Temurin 镜像。如果想切换为 openjdk:alpine
:
<configuration>
...
<from>
<image>openjdk:alpine</image>
</from>
...
</configuration>
你还可以配置标签(tags)、挂载卷(volumes)等其他 Docker 指令,详见 Jib Maven 插件文档。
8. 自定义 Java 运行时配置
Jib 也支持对 Java 运行时进行配置,包括:
jvmFlags
:传递给 JVM 的启动参数mainClass
:指定主类(Jib 默认会自动推断)args
:传递给 main 方法的参数
这些配置都可以在 <configuration>
中指定,具体可以查阅 Jib 配置文档。
9. 总结
在这篇文章中,我们介绍了如何使用 Google 的 Jib 工具来构建和发布 Docker 镜像,包括如何通过 Maven 插件来配置 Docker 和 Java 运行时参数。
示例代码已上传至 GitHub 仓库。需要的可以自行查阅。