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-plugindockerfile-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。

JibDocker 1

当然,你也可以类似地将镜像推送到 Google Container RegistryAmazon 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 仓库。需要的可以自行查阅。


原始标题:Dockerizing Java Apps using Jib | Baeldung