Gradle Jib プラグイン - Gradle で Docker コンテナイメージをビルドする

Jib とは?

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

  • Docker build flow Docker build flow

  • Jib 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 の設定項目は次のとおりである。

  • from
    • from で設定できる最も重要な項目は image である。
    • Jib ライブラリがアプリケーションをコンテナイメージにするときに使用するベースイメージを指定する項目である。
    • 何も設定しない場合、adoptopenjdk:11-jre がデフォルト値になる。
  • to
    • to で設定できる最も重要な項目は imagetags である。
    • ここでの imagefrom とは逆に、生成されたコンテナイメージが保存されるリポジトリを意味する。また tags は、このイメージに設定されるタグを意味する。
  • container
    • container ブロックでは、コンテナイメージとして実行されるときに必要な Java アプリケーションの jvmFlagsenvironment 設定を指定できる。

上記の内容をもとに、次のように 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 のアカウント情報を入れている。(ここには自分のアカウント情報を入れればよい。)
  • container
    • 動作時には JVM オプション (jvmFlags) として "-Xms128m""-Xmx128m" の 2 つを追加している。

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 を開いて見ると、生成されたイメージが登録されていることを確認できる。

Jib Dockerhub

参考