Quarkus アプリケーションのネイティブ実行可能ファイルへのコンパイル
概要
前書き リンクのコピーリンクがクリップボードにコピーされました!
アプリケーション開発者は、Red Hat ビルドの Quarkus を使用して、OpenShift 環境およびサーバーレス環境で実行される Java で書かれたマイクロサービスを作成できます。ネイティブ実行可能ファイルにコンパイルされたアプリケーションは、メモリーのフットプリントが小さく、起動時間は高速です。
本ガイドでは、Quarkus Getting Started プロジェクトをネイティブ実行可能ファイルにコンパイルする方法と、ネイティブ実行可能ファイルを設定してテストする方法を説明します。『Quarkus スタートガイド』 で作成したアプリケーションが必要です。
Red Hat ビルドの Quarkus を使用したネイティブ実行可能ファイルのビルドでは、以下について説明します。
- Podman または Docker などのコンテナーランタイムを使用した単一コマンドでのネイティブ実行可能ファイルのビルド
- 作成されたネイティブ実行可能ファイルを使用したカスタムコンテナーイメージの作成
- OpenShift Docker ビルドストラテジーを使用したコンテナーイメージの作成
- Quarkus ネイティブアプリケーションの OpenShift へのデプロイ
- ネイティブ実行可能ファイルの設定
- ネイティブ実行可能ファイルのテスト
前提条件
OpenJDK (JDK) 11 がインストールされ、
JAVA_HOME環境変数が Java SDK の場所を指定していること。- Red Hat ビルドの Open JDK は、Red Hat カスタマーポータルの Software Downloads ページから入手可能です (ログインが必要です)。
- OCI (Open Container Initiative) と互換性のあるコンテナーランタイム (Podman または Docker など)。
Quarkus Getting Started プロジェクトを完了していること。
- Quarkus Getting Started プロジェクトのビルド方法は、『Quarkus スタートガイド』 を参照してください。
-
あるいは、Quarkus quickstart archive をダウンロードするか、
Quarkus QuickstartsGit リポジトリーをクローンしてください。プロジェクトのサンプルは、getting-startedディレクトリーにあります。
多様性を受け入れるオープンソースの強化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、弊社 の CTO、Chris Wright のメッセージ を参照してください。
第1章 ネイティブ実行可能ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
Podman または Docker などのコンテナーランタイムを使用して、Quarkus アプリケーションからネイティブ実行可能ファイルを作成することができます。Quarkus は、ビルダーイメージを使用してバイナリー実行可能ファイルを作成します。これは、Red Hat Universal Base Images RHEL8-UBI および RHEL8-UBI minimal と共に使用することができます。Red Hat ビルドの Quarkus 1.7 は、quarkus.native.builder-image プロパティーのデフォルトとして registry.access.redhat.com/quarkus/mandrel-20-rhel8:20.3 を使用します。
お使いのアプリケーションのネイティブ実行可能ファイルには、アプリケーションコード、必須ライブラリー、Java API、および仮想マシン (VM) の縮小版が含まれます。縮小された仮想マシンベースは、アプリケーションの起動時間を高速化し、ディスクのフットプリントを小さくします。
手順
Getting Started プロジェクトの
pom.xmlファイルを開き、nativeプロファイルが含まれていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Quarkus
nativeプロファイルを使用すると、ネイティブ実行可能ファイルおよびネイティブイメージテストの両方を実行することができます。以下のいずれかの方法を使用して、ネイティブ実行可能ファイルをビルドします。
Docker を使用してネイティブ実行可能ファイルをビルドします。
./mvnw package -Pnative -Dquarkus.native.container-build=true
./mvnw package -Pnative -Dquarkus.native.container-build=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow Podman を使用してネイティブ実行可能ファイルをビルドします。
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow これらのコマンドは、
targetディレクトリーにgetting-started-*-runnerバイナリーを作成します。重要Quarkus アプリケーションをネイティブ実行可能ファイルにコンパイルすると、分析および最適化の際にメモリーを大量に消費します。
quarkus.native.native-image-xmx設定プロパティーを設定することで、ネイティブコンパイル時に使用されるメモリーの量を制限することができます。メモリー制限を低く設定すると、ビルド時間が長くなる可能性があります。
ネイティブ実行可能ファイルを実行します。
./target/getting-started-*-runner
./target/getting-started-*-runnerCopy to Clipboard Copied! Toggle word wrap Toggle overflow ネイティブ実行可能ファイルをビルドする場合、
prodプロファイルが有効化され、Quarkus ネイティブテストは、prodプロファイルを使用して実行されます。これは、quarkus.test.native-image-profileプロパティーを使用して変更することができます。
第2章 カスタムコンテナーイメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
以下のいずれかの方法を使用して、Quarkus アプリケーションからコンテナーイメージを作成できます。
- 手動でのコンテナーの作成
- OpenShift Docker ビルドを使用したコンテナーの作成
Quarkus アプリケーションをネイティブ実行可能ファイルにコンパイルすると、分析および最適化の際にメモリーを大量に消費します。quarkus.native.native-image-xmx 設定プロパティーを設定することで、ネイティブコンパイル時に使用されるメモリーの量を制限することができます。メモリー制限を低く設定すると、ビルド時間が長くなる可能性があります。
2.1. 手動でのコンテナーの作成 リンクのコピーリンクがクリップボードにコピーされました!
本セクションでは、Linux X86_64 向けにアプリケーションを使用してコンテナーイメージを手動で作成する方法を説明します。Quarkus Native コンテナーを使用してネイティブイメージを作成する場合、Linux X86_64 オペレーティングシステムをターゲットとする実行可能ファイルを作成します。お使いのホストオペレーティングシステムが別のものである場合は、バイナリーを直接実行することはできないので、コンテナーを手動で作成する必要があります。
Quarkus Getting Started プロジェクトには、以下の内容と共に src/main/docker ディレクトリーに Dockerfile.native が含まれます。
Dockerfiles は、ベースイメージとして UBI を使用します。このベースイメージは、コンテナーで機能するように設計されています。Dockerfiles は、ベースイメージの minimal バージョン を使用して、作成されたイメージのサイズを縮小します。
手順
以下のいずれかの方法を使用して、ネイティブ Linux 実行可能ファイルをビルドします。
Docker を使用してネイティブ実行可能ファイルをビルドします。
./mvnw package -Pnative -Dquarkus.native.container-build=true
./mvnw package -Pnative -Dquarkus.native.container-build=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow Podman を使用してネイティブ実行可能ファイルをビルドします。
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
以下のいずれかの方法を使用して、コンテナーイメージをビルドします。
Docker を使用してコンテナーイメージをビルドします。
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .Copy to Clipboard Copied! Toggle word wrap Toggle overflow Podman を使用してコンテナーイメージをビルドします。
podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .Copy to Clipboard Copied! Toggle word wrap Toggle overflow
コンテナーを実行します。
Docker を使用してコンテナーを実行します。
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-startedCopy to Clipboard Copied! Toggle word wrap Toggle overflow Podman を使用してコンテナーを実行します。
podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-startedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Red Hat OpenShift Container Platform での Quarkus Maven アプリケーションのデプロイに関する詳細は、『Red Hat OpenShift Container Platform での Quarkus アプリケーションのデプロイ』 を参照してください。
2.2. OpenShift Docker ビルドを使用したコンテナーの作成 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Docker ビルドストラテジーを使用して、Quarkus アプリケーションのコンテナーイメージを作成できます。このストラテジーは、クラスターでビルド設定を使用してコンテナーを作成します。
前提条件
- Red Hat OpenShift Container Platform クラスターにアクセスでき、最新バージョンの OpenShift CLI (oc) がインストールされていること。oc のインストールに関する詳細は、『OpenShift Container Platform クラスターのインストールおよび設定』 ガイドの「CLI のインストール」のセクションを参照してください。
- OpenShift API エンドポイントの URL。
手順
OpenShift CLI にログインします。
oc login -u <username_url>
oc login -u <username_url>Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenShift に新規プロジェクトを作成します。
oc new-project <project_name>
oc new-project <project_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow src/main/docker/Dockerfile.nativeファイルをベースにビルド設定を作成します。cat src/main/docker/Dockerfile.native | oc new-build --name <build_name> --strategy=docker --dockerfile -
cat src/main/docker/Dockerfile.native | oc new-build --name <build_name> --strategy=docker --dockerfile -Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクトをビルドします。
oc start-build <build_name> --from-dir .
oc start-build <build_name> --from-dir .Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクトを OpenShift にデプロイします。
oc new-app <build_name>
oc new-app <build_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第3章 ネイティブ実行可能ファイルの設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
設定プロパティーは、ネイティブ実行可能ファイルの生成方法を定義します。application.properties ファイルを使用して、Quarkus アプリケーションを設定できます。
設定プロパティー
以下の表は、ネイティブ実行可能ファイルの生成方法を定義するよう設定できる設定プロパティーの一覧です。
| プロパティー | 説明 | タイプ | デフォルト |
|---|---|---|---|
|
| ビルドプロセスにパスする追加の引数。 | 文字列の一覧 | |
|
| HTTP URL ハンドラーの有効化。これにより、HTTP URL に URL.openConnection() が可能となります。 | ブール値 |
|
|
| HTTPS URL ハンドラーの有効化。これにより、HTTPS URL に URL.openConnection() が可能となります。 | ブール値 |
|
|
| ネイティブイメージにすべてのセキュリティーサービスを追加します。 | ブール値 |
|
|
| ネイティブイメージにすべてのキャラクターセットを追加します。これにより、イメージサイズが大きくなります。 | ブール値 |
|
|
| Graal ディストリビューションのパスが含まれます。 | 文字列 |
|
|
| JDK のパスが含まれます。 |
| |
|
| ネイティブイメージを生成するために使用する Java の最大ヒープサイズ。 | 文字列 | |
|
| ネイティブイメージのビルドを実行する前に、デバッガーがビルドプロセスにアタッチするのを待ちます。GraalVM インターナルの知識のあるユーザーにとって、これは高度なオプションになります。 | ブール値 |
|
|
| Docker を使用したビルド中にデバッグポートをパブリッシュし、debug-build-process が true の場合。 | ブール値 |
|
|
| ネイティブイメージサーバーを再起動します。 | ブール値 |
|
|
| メモリー管理を向上させるために分離を有効化します。 | ブール値 |
|
|
| ネイティブイメージが失敗した場合は、JVM ベースのフォールバックイメージを作成します。 | ブール値 |
|
|
| ネイティブイメージサーバーを使用します。これにより、コンパイルを高速化することは可能ですが、キャッシュの無効化問題により、ドロップが変更される可能性があります。 | ブール値 |
|
|
| すべての META-INF/services エントリーを自動的に登録します。 | ブール値 |
|
|
| インスペクション用にすべてのプロキシーのバイトコードをダンプします。 | ブール値 |
|
|
| コンテナーランタイムを使用したビルド。デフォルトで Docker が使用されます。 | ブール値 |
|
|
| イメージをビルドするための Docker イメージ。 | 文字列 |
|
|
| イメージをビルドするために使用されるコンテナーランタイム。たとえば、Docker などがあります。 | 文字列 | |
|
| コンテナーランタイムにパスするオプション。 | 文字列の一覧 | |
|
| イメージの VM イントロスペクションを有効化します。 | ブール値 |
|
|
| イメージのフルスタックトレースを有効化します。 | ブール値 |
|
|
| コールパスおよび含まれるパッケージ/クラス/メソッドのレポートを生成します。 | ブール値 |
|
|
| フルスタックトレースを使用して例外を報告します。 | ブール値 |
|
|
| ランタイム時にエラーを報告します。サポート対象外の機能を使用している場合は、お使いのアプリケーションがランタイム時に失敗する可能性があります。 | ブール値 |
|
|
|
ネイティブイメージに追加する必要のあるリソースパスに一致する glob のコンマ区切りリスト。すべてのプラットフォームで、スラッシュ ( | 文字列の一覧 | |
|
| デバッグを有効化し、別の .debug ファイルにデバッグシンボルを生成します。 | ブール値 |
|
サポートされる glob 機能とその説明
以下の表は、サポートされる glob 機能とその説明を一覧表示しています。
| 文字 | 機能の説明 |
|
|
スラッシュ ( |
|
|
スラッシュ ( |
|
| 1 つの文字と一致しますが、スラッシュとは一致しません。 |
|
| ブラケットで指定した範囲の文字の 1 つと一致しますが、スラッシュとは一致しません。 |
|
| ブラケットで指定した範囲の文字の 1 つと一致しますが、スラッシュとは一致しません。 |
|
| ブラケットで指定していない文字の 1 つと一致しますが、スラッシュとは一致しません。 |
|
| ブラケットで指定した範囲外の文字の 1 つと一致しますが、スラッシュとは一致しません。 |
|
| コンマ区切り文字とトークンが交互に連続する文字列で、あらゆるトークンと一致します。トークンには、ワイルドカード、ネストされたオルタネーション、および範囲が含まれます。 |
|
|
エスケープ文字。エスケープには、 |
3.1. Quarkus ネイティブコンパイルのメモリー消費の設定 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus アプリケーションをネイティブ実行可能ファイルにコンパイルすると、分析および最適化の際にメモリーを大量に消費します。quarkus.native.native-image-xmx 設定プロパティーを設定することで、ネイティブコンパイル時に使用されるメモリーの量を制限することができます。メモリー制限を低く設定すると、ビルド時間が長くなる可能性があります。
手順
以下のいずれかの方法を使用して
quarkus.native.native-image-xmxプロパティーに値を設定し、ネイティブイメージのビルドタイム中のメモリー消費を制限します。application.propertiesファイルの使用quarkus.native.native-image-xmx=<maximum_memory>
quarkus.native.native-image-xmx=<maximum_memory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムプロパティーの設定
mvn -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.native-image-xmx=<maximum_memory>
mvn -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.native-image-xmx=<maximum_memory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、Docker を使用してネイティブ実行可能ファイルをビルドします。
-Dquarkus.native.container-runtime=podman引数を追加して Podman を使用します。
たとえば、メモリー制限を 6 GB に設定するには、quarkus.native.native-image-xmx=6g と入力します。値は、2MB より大きい 1024 の倍数でなければなりません。メガバイトを示す m または M の文字を追加するか、ギガバイトを示す g または G の文字を追加します。
第4章 ネイティブ実行可能ファイルのテスト リンクのコピーリンクがクリップボードにコピーされました!
ネイティブ実行可能ファイルの機能をテストするために、ネイティブモードで実行するアプリケーションをテストします。@NativeImageTest アノテーションを使用して、ネイティブ実行可能ファイルをビルドし、http エンドポイントに対してテストを実行します。
手順
pom.xmlファイルを開き、nativeプロファイルに以下の要素が含まれていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow failsafe-maven-pluginはインテグレーションテストを実行し、作成されたネイティブ実行可能ファイルの場所を示します。src/test/java/org/acme/quickstart/NativeGreetingResourceIT.javaファイルを開き、以下の内容が含まれていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow テストを実行します。
./mvnw verify -Pnative
./mvnw verify -PnativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の例は、このコマンドの出力を示しています。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Quarkus は、ネイティブイメージの開始まで 60 秒間待機し、その後ネイティブテストに自動的に失敗します。この待機時間は、
quarkus.test.native-image-wait-timeシステムプロパティーを使用して変更可能です。以下のコマンドを使用して、待機時間を延長することができます。
<duration>は、秒単位の待機時間になります。./mvnw verify -Pnative -Dquarkus.test.native-image-wait-time=<duration>
./mvnw verify -Pnative -Dquarkus.test.native-image-wait-time=<duration>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1. ネイティブ実行可能ファイルとして実行する場合のテストを除外する リンクのコピーリンクがクリップボードにコピーされました!
ネイティブアプリケーションに対してテストを実行する場合、HTTP エンドポイントと対話することしかできません。テストはネイティブでは実行されないため、お使いのアプリケーションのコードに対して、JVM での実行でリンクできる場合と同じようにリンクすることはできません。
JVM とネイティブ実行可能ファイルとの間でテストクラスを共有することができ、@DisabledOnNativeImage アノテーションを使用して特定のテストを除外して JVM でのみ実行することができます。
4.2. 既存のネイティブ実行可能ファイルのテスト リンクのコピーリンクがクリップボードにコピーされました!
既存の実行可能ファイルのビルドに対してテストすることができます。これにより、バイナリーのビルド後にバイナリーで複数のテストのセットを段階的に実行することができます。
手順
すでにビルドされたネイティブ実行可能ファイルに対してテストを実行します。
./mvnw test-compile failsafe:integration-test
./mvnw test-compile failsafe:integration-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、Failsafe Maven Plugin を使用して、既存のネイティブイメージに対してテストを実行します。
あるいは、以下のコマンドを使用してネイティブ実行可能ファイルへのパスを指定することもできます。
<path>は、ネイティブイメージパスになります。./mvnw test-compile failsafe:integration-test -Dnative.image.path=<path>
./mvnw test-compile failsafe:integration-test -Dnative.image.path=<path>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第5章 その他のリソース リンクのコピーリンクがクリップボードにコピーされました!
改訂日時: 2021-04-27 03:44:13 UTC