1. 概要

このチュートリアルでは、Jibと、それがJavaアプリケーションのコンテナー化をどのように簡素化するかを見ていきます。

単純なSpring Bootアプリケーションを使用して、Jibを使用してDockerイメージをビルドします。 次に、イメージをリモートレジストリに公開します。

また、dockerfileとdockerツールを使用したSpringBootアプリケーションのドッキングに関するチュートリアルも参照してください。

2. ジブ入門

Jib は、JavaアプリケーションのDockerイメージを構築するためにGoogleが管理しているオープンソースのJavaツールです。 Dockerfileを作成する必要がないため、コンテナ化が簡素化されます。

実際、Dockerイメージを自分で作成して公開するためにをインストールする必要はありません。

Googleは、JibをMavenプラグインとGradleプラグインの両方として公開しています。 これは、ビルドするたびにJibがアプリケーションに加えた変更をキャッチすることを意味するので便利です。 これにより、Dockerのビルド/プッシュコマンドを個別に節約でき、CIパイプラインへの追加が簡単になります。

Spotifyのdocker-maven-pluginプラグインやdockerfile-mavenプラグインなど、他にもいくつかのツールがありますが、前者は非推奨になり、後者にはdockerfile

3. シンプルなあいさつアプリ

簡単なspring-bootアプリケーションを使用して、Jibを使用してドッキングします。 単純なGETエンドポイントを公開します。

http://localhost:8080/greeting

これは、SpringMVCコントローラーを使用して非常に簡単に実行できます。

@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. 展開の準備

また、デプロイ先のDockerリポジトリで認証するようにローカルで設定する必要があります。

この例では、DockerHubクレデンシャルを.m2 /settings.xml提供します。

<servers>
    <server>
        <id>registry.hub.docker.com</id>
        <username><DockerHub Username></username>
        <password><DockerHub Password></password>
    </server>
</servers>

クレデンシャルを提供する方法は他にもあります。 Googleが推奨する方法は、ファイルシステムに暗号化された形式でクレデンシャルを保存できるヘルパーツールを使用することです。 この例では、docker-credential-helpersを使用できます。 プレーンテキストのクレデンシャルをに保存する代わりに settings.xml 、これははるかに安全ですが、このチュートリアルの範囲外です。

5. Jibを使用したDockerHubへのデプロイ

これで、 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-appDockerHubにアップロードするには、次のようにします。

export IMAGE_PATH=registry.hub.docker.com/baeldungjib/spring-jib-app

以上です! これにより、アプリケーションのDockerイメージがビルドされ、DockerHubにプッシュされます。

もちろん、同様の方法で画像をGoogleContainerRegistryまたはAmazonElasticContainerRegistryにアップロードできます

6. Mavenコマンドの簡素化

また、他のMavenプラグインと同様に、代わりに pom でプラグインを構成することで、最初のコマンドを短縮できます。

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

この変更により、Mavenコマンドを簡略化できます。

mvn compile jib:build

7. Dockerアスペクトのカスタマイズ

デフォルトでは、 Jibは、FROMやENTRYPOINTなど、必要なものについて多くの合理的な推測を行います。

私たちのニーズに固有のアプリケーションにいくつかの変更を加えましょう。

まず、SpringBootはデフォルトでポート8080を公開します。

ただし、たとえば、アプリケーションをポート8082で実行し、コンテナーを介して公開できるようにしたいとします。

もちろん、Bootで適切な変更を加えます。 そして、その後、Jibを使用して画像で公開できるようにすることができます。

<configuration>
    ...
    <container>
        <ports>
            <port>8082</port>
        </ports>
    </container>
</configuration>

または、別のFROMが必要だとしましょう。 デフォルトでは、JibはディストリビューションのないJavaイメージを使用します。

alpine-java などの別のベースイメージでアプリケーションを実行する場合は、同様の方法でアプリケーションを構成できます。

<configuration>
    ...
    <from>                           
        <image>openjdk:alpine</image>
    </from>
    ...
</configuration>

タグ、ボリューム、および他のいくつかのDockerディレクティブを同じ方法で構成します。

8. Javaアスペクトのカスタマイズ

また、関連付けにより、Jibは多数のJavaランタイム構成もサポートします。

  • jvmFlags は、JVMに渡す起動フラグを示すためのものです。
  • mainClass メインクラスを示すためのものです。 ジブはデフォルトで自動的に推測を試みます。 
  • args は、mainメソッドに渡されるプログラム引数を指定する場所です。

もちろん、Jibのドキュメントをチェックして、利用可能なすべての構成プロパティを確認してください。

9. 結論

このチュートリアルでは、Mavenを介してDockerディレクティブとJavaランタイム構成にアクセスする方法など、GoogleのJibを使用してDockerイメージを構築および公開する方法を説明しました。

いつものように、この例のソースコードはGithubから入手できます。