誰でも簡単に: Jib を使用した Java アプリケーションのコンテナ化
Google Cloud Japan Team
※この投稿は米国時間 2020 年 8 月 11 日に、Google Cloud blog に投稿されたものの抄訳です。
Java アプリケーションの Docker イメージをビルドする際に、開発者の間では Jib の人気が高まっています。Docker の知識がない方でも、Jib を使えばどんな Java アプリもスペース効率の良い最適化されたコンテナ イメージに変えることができます。Jib は、再現可能な宣言型の方法でコンテナ イメージをビルドし、編集、コンパイル、テストからなる極めて短い開発サイクルを実施して、コンテナのベスト プラクティスを透過的に適用します。Docker をインストールする必要はなく、スクリプトのような Dockerfile を記述する必要もありません。
さらに良いことに、Jib はますます幅広い Java 開発エコシステムをサポートするようになりました。昨年 Jib の一般提供が開始されて以来、Google では Jib の技術的な機能の向上だけでなく、ユーザーベースやコミュニティの成長など、Jib エコシステムの拡大に注力してきました。最近のハイライトをいくつか紹介します。
Jib Plugin Extension Framework の紹介
Jib が気に入ってはいるものの、もう 1 つできたらいいのにと思っていることはありませんか。強力な Jib Plugin Extension Framework により、Jib を好みに合わせて簡単に拡張し、調整できるようになりました。たとえば、ZIP ファイルから取得したコンテンツを含むカスタム イメージのレイヤーを追加する拡張を記述したとします。あるいは、誰か他の人がそのような拡張を記述したとします。Jib Plugin Extension Framework を使用すれば、その拡張を取得して自分のプロジェクトに適用できます。
今年 6 月に初めてリリースされた Jib Plugin Extension Framework により、ビルドするイメージのあらゆる側面を微調整できるようになりました。これには Container Build Plan Specification が利用されています。これは、ツールに依存しない汎用的な方法でイメージのビルド方法を記述したものです。
この拡張フレームワークにより、イメージ レイヤーの微調整から、起動の高速化のための GraalVM ネイティブ イメージやフットプリントの縮小のための jlink イメージのコンテナ化まで、さまざまな可能性が広がるでしょう。GitHub で Jib Extensions リポジトリをチェックしてみてください。ビルドに役立つ拡張機能が見つかるかもしれません。また、拡張機能の作成において中核となる Jib チームにご参加いただくと、コミュニティの一員として恩恵を受けられます。
アプリ フレームワークのサポートの改善
Spring Boot
Spring Boot は、Java アプリ フレームワークの中で大きなマーケット シェアを誇り、Spring Boot 形式での fat JAR の作成をネイティブにサポートしています。ただし、Spring Boot は Java アプリのビルドにおいて優れたデベロッパー エクスペリエンスを提供するものの、そのアプローチは少し独自性が強いものとなり得ます。Google は、Spring Boot の重要性を理解しており、ファーストパーティによる Spring Boot の統合を Jib に実装することを強く支持してきました。たとえば、Jib のパッケージ化されたコンテナ化モードでは、Spring Boot をすぐに使用できるようになり、コンテナ化に適さない fat Spring Boot JAR ではなく、オリジナルの thin JAR をコンテナ化します。
これは、Spring Boot に対して Jib がネイティブにサポートしているもののほんの一例にすぎません。たとえば、Google では最近、Spring Boot の Jib 拡張機能として Maven と Gradle の最初のイテレーションをリリースしました。これは長年続いている「spring-boot-devtools」の問題に対処するのに便利な方法です。今後 Google では、ユーザー エクスペリエンスを向上させるために、拡張フレームワークを介してファーストパーティのサポートも強化していく予定です。
Quarkus
Quarkus は、人気が高まっているもう 1 つのフレームワークです。Jib ビルド プラグインを適用しなくても、以前から Quarkus を使用してコアとなる Jib エンジンを使用して最適化されたイメージを作成できていました。それでも、Google では Jib ビルド プラグインのユーザーに対しても Quarkus をサポートすることを望んでいました。そのため、Quarkus の特別なコンテナ化のニーズに対応するために、ファースト パーティの Jib 拡張機能である Maven と Gradle を公開しました。Quarkus の組み込みの Jib エンジンを利用したコンテナ化と比較して、Jib ビルド プラグインを使用すると、イメージのビルドおよび構成方法をより細かく制御できます(そして Jib Extensions Framework を使用することでさらに細かく制御できるようになりました)。
GraalVM
最後に、GraalVM の「ネイティブ イメージ」(コンテナ イメージと混同しないでください)に、Maven Jib 拡張が追加されました。近い将来、Gradle のサポートも追加する予定です。
CI / CD パフォーマンスの向上
Jib では、ベースイメージをダウンロードしなくてもイメージをビルドして push できることをご存じでしょうか。そのため、多くの組織が CI / CD ツールを強化するためのイメージのビルドツールとして Jib を使用しているのは当然とも言えます。CI / CD プロセスの一部として Jib を使用すると、時間、帯域幅、スペースを節約できます。
たとえば、Jib を使用しない場合、Dockerfile に FROM openjdk:11-jre-slim と書き込むと、Docker エンジンは最初に大きな JRE を含むベースイメージをダウンロードします。CI / CD では通常、Docker エンジンの内部イメージ キャッシュを保存して復元しないため、CI / CD 環境では、新しいパイプラインを実行するたびに同じベースイメージを再ダウンロードする必要があります。一方、Jib では賢明なことに、可能な限りベースイメージのダウンロードがスキップされます。完全に空のリポジトリに初めてイメージをプッシュする場合を除き、常にそのように動作します。
Skaffold を使用したローカルでの Kubernetes の開発の改善
Jib は Skaffold File Sync と連携してすぐに使用できます。キーワード auto を使用して、ゼロ同期構成で実行中のコンテナへのリモート ファイル同期を利用できます。このメカニズムは、skaffold.yaml で同期ブロックを構成しなくても、ファイルが変更されるとファイルをビルドして同期するように設計されています。詳細については、ドキュメントをご覧ください。
Java コンテナのコースの設定
Jib は一般提供以来、大きな進歩を遂げており、今ではかなり大きなコミュニティを抱えています。中核となる Jib チームは、これまでエコシステムの拡大に懸命取り組んできており、Jib のコミュニティがさらに大きく成長していくことは間違いありません。ご質問やフィードバックがございましたら、Gitter チャンネルまたは GitHub リポジトリをご覧ください。また、スタック オーバーフローで質問することもできます。
Google では、Java 開発を簡易化、加速し、コンテナ イメージを適切にビルドするために、誰もが Jib を使用すべきだと考えています。Jib を使い始めるには、サンプルと次の Codelab をご確認ください。
- Spring Boot Kotlin アプリをコンテナ化して Cloud Run にデプロイする
- Spring Boot アプリケーションを Kubernetes にデプロイする
- Micronaut アプリケーションを Kubernetes にデプロイする
-ソフトウェア エンジニア Chanseok Oh / ソフトウェア エンジニア Appu Goundan