Gradle Jib プラグイン - Gradle で Docker コンテナイメージをビルドする
Jib とは?
Jib は、Dockerfile を使用したり Docker をインストールしたりせずに Java アプリケーションコンテナをビルドできる Google のオープンソース Java コンテナライザーである。
Jib は、アプリケーションをコンテナイメージとしてパッケージ化するすべての手順を高速に処理するコンテナイメージビルダーである。
Dockerfile を書く必要も Docker をインストールする必要もなく、Maven および Gradle のプラグインとして動作する。プラグインをインストールした後、ターゲットイメージの設定とビルド定義だけを行えば、Java アプリケーションをすぐにコンテナ化できる。
-
Docker build flow

-
Jib build flow

Jib の設定と実行方法
Jib を使用するには、build.gradle に関連ライブラリを追加し、コンテナイメージを設定する必要がある。
事前準備
- Java 開発環境が必要である。
- Docker Hub アカウントが必要である。
- 持っていない場合は、先に登録しておく。
Jib サンプルプログラムを作成する
まずプロジェクトを作成する。
curl https://start.spring.io/starter.tgz \
-d bootVersion=2.7.5 \
-d dependencies=web \
-d baseDir=spring-gradle-jib \
-d groupId=com.devkuma \
-d artifactId=devkuma-gradle-jib \
-d packageName=com.devkuma.hello \
-d applicationName=HelloApplication \
-d packaging=jar \
-d javaVersion=17 \
-d type=gradle-project | tar -xzvf -
次のように簡単なアプリケーションを作成する。
package com.devkuma.hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
@RequestMapping("/")
public String hello() {
return "hello";
}
}
上で生成したプロジェクトは GitHub を活用するとよい。
Jib ライブラリを追加する
build.gradle ビルドファイルの plugins に Jib ライブラリを追加する。
plugins {
//... omitted ...
id 'com.google.cloud.tools.jib' version '3.2.0'
}
Jib 設定を追加する
build.gradle ファイルに Jib 設定を追加する。
Jib の設定項目は次のとおりである。
fromfromで設定できる最も重要な項目はimageである。- Jib ライブラリがアプリケーションをコンテナイメージにするときに使用するベースイメージを指定する項目である。
- 何も設定しない場合、
adoptopenjdk:11-jreがデフォルト値になる。
totoで設定できる最も重要な項目はimageとtagsである。- ここでの
imageはfromとは逆に、生成されたコンテナイメージが保存されるリポジトリを意味する。またtagsは、このイメージに設定されるタグを意味する。
containercontainerブロックでは、コンテナイメージとして実行されるときに必要な Java アプリケーションのjvmFlagsやenvironment設定を指定できる。
上記の内容をもとに、次のように Jib の設定情報を作成する。
jib {
from {
image = "adoptopenjdk/latest"
}
to {
image = "devkuma/hello-jib"
tags = ["latest"]
auth {
username = 'devkuma'
password = "xxxx"
}
}
container {
jvmFlags = ["-Xms128m", "-Xmx128m"]
}
}
- from
adoptopenjdk/latestイメージをベースイメージとしてコンテナイメージを作成する。
- to
- Docker Hub の
devkuma/hello-jibリポジトリにlatestタグを付けてプッシュし、コンテナ化する。 authに Docker Hub のアカウント情報を入れている。(ここには自分のアカウント情報を入れればよい。)
- Docker Hub の
- container
- 動作時には JVM オプション (
jvmFlags) として"-Xms128m"と"-Xmx128m"の 2 つを追加している。
- 動作時には JVM オプション (
Jib イメージの作成を確認する
次の Jib イメージ作成コマンドでイメージを作成する。
$ ./gradlew jib
以下は実際に作成コマンドを実行した内容である。
% ./gradlew jib
Starting a Gradle Daemon, 1 busy and 3 stopped Daemons could not be reused, use --status for details
> Task :jib
Containerizing application to devkuma/gradle-jib, devkuma/gradle-jib...
Base image 'adoptopenjdk' does not use a specific image digest - build may not be reproducible
Using credentials from to.auth for devkuma/gradle-jib
The base image requires auth. Trying again for adoptopenjdk...
Using base image with digest: sha256:3f2982d13b40d8c6d56a3a736c4f6c51a3c99688c2b434a27ed5d1b5f3fbedfb
Container entrypoint set to [java, -Xms128m, -Xmx128m, -cp, @/app/jib-classpath-file, com.devkuma.hello.HelloApplication]
Built and pushed image as devkuma/gradle-jib, devkuma/gradle-jib
Executing tasks:
[==============================] 100.0% complete
BUILD SUCCESSFUL in 58s
3 actionable tasks: 1 executed, 2 up-to-date
user@AD02291831 spring-gradle-jib %
Jib イメージの作成と登録を確認する
実際に Docker Hub を開いて見ると、生成されたイメージが登録されていることを確認できる。

参考
- Introducing Jib — build Java Docker images better | Google Cloud Platform Blog
- Jib で Java コンテナをビルドする | Google Cloud
- 上記のすべてのソースコードは GitHub で確認できる。