コンテナーイメージ
コンテナーイメージのエクステンション
Jib
エクステンション quarkus-container-image-jib は、コンテナーイメージのビルドを実行するために Jib を使用しています。Jib を Quarkus で使用する主な利点は、すべての依存関係 (target/lib の下にあるすべてのもの) が実際のアプリケーションとは別のレイヤーにキャッシュされるため、リビルドが非常に高速かつ小規模に (プッシュする場合) 行えることです。このエクステンションを使用するもう 1 つの重要な利点は、コンテナーイメージレジストリーにプッシュする機能さえあれば、専用のクライアントサイドツール (Docker など) やデーモンプロセス (Docker デーモンなど) を実行しなくてもコンテナーイーメージを作成できることです。
この機能を使用するには、以下のエクステンションをプロジェクトに追加します。
quarkus extension add 'container-image-jib'
./mvnw quarkus:add-extension -Dextensions='container-image-jib'
./gradlew addExtension --extensions='container-image-jib'
必要なことがコンテナーイメージを構築するだけで、レジストリーへのプッシュが不要な場合 (基本的には quarkus.container-image.build=true を設定して quarkus.container-image.push のままにしておくことで、デフォルトは false になります)、このエクステンションはコンテナーイメージを作成し、Docker デーモンに登録します。これは、Docker がイメージのビルドには使われなくても必要であることを意味します。また、このモードを使用すると、 docker images を実行するとコンテナーイメージが表示されます。
|
追加ファイルの追加
コンテナーイメージに追加のファイル(Quarkus のビルドで作成されたもの以外)を追加する必要がある場合があります。このような場合に対応するため、Quarkus は、 src/main/jib 以下のファイルをすべてビルドされたコンテナーイメージにコピーします (これは、Jib Maven や Gradle プラグインがサポートしているのと基本的に同じ考え方です)。例えば、 src/main/jib/foo/bar が存在すると、 /foo/bar がコンテナファイルシステムに追加されます。
JVM デバッグ
ビルドしたコンテナイメージでは、実行時に条件付きでJavaデバッグを有効にする必要がある場合があります。
ベースイメージが変更されていない(つまり、 ubi8/openjdk-11-runtime または ubi8/openjdk-17-runtime が使用されている)場合、 quarkus.jib.jvm-arguments 設定プロパティを使用して、起動時に JVM がデバッグポートをリッスンするようにすることができます。
具体的な構成例:
quarkus.jib.jvm-arguments=-agentlib:jdwp=transport=dt_socket\\,server=y\\,suspend=n\\,address=*:5005
他のベースイメージでは、環境変数の設定によりデバッグが可能になる起動スクリプトが提供されている場合があり、その場合はコンテナの起動時に環境変数を設定します。
カスタムエントリーポイント
最後に、 quarkus.jib.jvm-entrypoint 設定プロパティを使用すると、コンテナのエントリポイントを完全にオーバーライドすることができるため、JVMのデバッグ構成をハードコードするか、詳細を処理するスクリプトを指定することができます。
例えば、コンテナの構築にベースイメージ ubi8/openjdk-11-runtime や ubi8/openjdk-17-runtime を使用する場合、アプリケーションのプロパティファイル上でエントリポイントをハードコードすることができます。
quarkus.jib.jvm-entrypoint=java,-Dcustom.param=custom_value,-jar,quarkus-run.jar
または、カスタムスタートアップスクリプトを作成し、プロパティファイルで参照することもできます。この方法は、環境変数を使用してアプリケーションのパラメータを設定する必要がある場合に有効です。
quarkus.jib.jvm-entrypoint=/bin/sh,run-java.sh
java \
-Djavax.net.ssl.trustStore=/deployments/truststore \
-Djavax.net.ssl.trustStorePassword="$TRUST_STORE_PASSWORD" \
-jar quarkus-run.jar
/home/jboss は、ベースイメージ ubi8/openjdk-11-runtime および ubi8/openjdk-17-runtime 内のすべての Quarkus バイナリの WORKDIR です( ubi8/openjdk-17-runtime 用の Dockerfile )。
|
マルチモジュールプロジェクトとレイヤリング
Quarkusアプリケーションを1つのモジュールとし、さらにさまざまなサポートプロジェクトの依存関係を他のモジュールとして含むマルチモジュールプロジェクトを構築する場合、Quarkusでは、サポートモジュールが通常のアプリケーション依存関係よりも頻繁に変更されることを想定して、それらのサポートモジュールを他のアプリケーション依存関係とは別のコンテナイメージレイヤーに配置することをサポートしています。このため、アプリケーションの依存関係に変更がない場合は、リビルドを高速に行うことができます。
この機能を有効にするには、ビルドツール起動時にシステムプロパティとして、またはビルドツールプロパティとして、プロパティ quarkus.bootstrap.workspace-discovery を true に設定する必要があります。このプロパティは、ビルドプロセスの非常に早い段階で認識される必要があるため、 application.properties で設定しても正しく 機能しません 。
AppCDS
Quarkusは、Jibを使用したコンテナイメージの生成時に、 アプリケーションクラスデータ共有 アーカイブを生成して含めることをサポートしています。詳細については、 AppCDSのドキュメント を参照してください。
Docker
エクステンション quarkus-container-image-docker は、Docker ビルドを実行するために src/main/docker 下で Docker バイナリーと生成された Dockerfiles を使用しています。
この機能を使用するには、以下のエクステンションをプロジェクトに追加します。
quarkus extension add 'container-image-docker'
./mvnw quarkus:add-extension -Dextensions='container-image-docker'
./gradlew addExtension --extensions='container-image-docker'
quarkus-container-image-docker エクスンテンションは、docker buildx build を使って、 マルチプラットフォーム (またはマルチアーキ) イメージを作成することができます。以下の Dockerオプション のセクションにある quarkus.docker.buildx.* の設定項目を参照してください。
docker buildx build は、単一のプラットフォーム向けにビルドする場合のみ、ビルド結果の docker images への読み込み をサポートします。したがって、 quarkus.docker.buildx.platform プロパティに複数の引数を指定した場合、結果のイメージは docker images にロードされません。 quarkus.docker.buildx.platform が省略された場合、または単一のプラットフォームのみが指定された場合は、その後 docker images にロードされるようになります。
|
S2I
エクステンション quarkus-container-image-s2i は、OpenShift クラスター内でコンテナービルドを実行するために S2I バイナリービルドを使用しています。バイナリービルドの考え方は、アーティファクトとその依存関係をクラスタにアップロードするだけで、ビルド中にそれらがビルダーイメージにマージされます (デフォルトは fabric8/s2i-java)。
このアプローチの利点は、クラスターへの変更を簡単にロールアウトできる OpenShift の DeploymentConfig と組み合わせることができることです。
この機能を使用するには、以下のエクステンションをプロジェクトに追加します。
quarkus extension add 'container-image-s2i'
./mvnw quarkus:add-extension -Dextensions='container-image-s2i'
./gradlew addExtension --extensions='container-image-s2i'
S2I のビルドでは、 BuildConfig と 2 つの ImageStream リソースを作成する必要があります。このようなオブジェクトの作成は、Quarkus Kubernetes エクステンションによって行われます。
Buildpack
quarkus-container-image-buildpack は、コンテナイメージのビルドを行うために buildpacks を使用しています。buildpacksは、実際のビルドにDockerデーモンを使用します。buildpacksはDockerの代替品をサポートしていますが、このエクステンションはDockerでのみ動作します。
さらに、ユーザーはどのビルドイメージを使用するかを設定する必要があります(デフォルトのイメージは提供されていません)。例えば、以下のようになります。
quarkus.buildpack.jvm-builder-image=<jvm builder image>
またはネイティブの場合、
quarkus.buildpack.native-builder-image=<native builder image>
この機能を使用するには、以下のエクステンションをプロジェクトに追加します。
quarkus extension add 'container-image-buildpack'
./mvnw quarkus:add-extension -Dextensions='container-image-buildpack'
./gradlew addExtension --extensions='container-image-buildpack'
buildpack コンテナイメージエクステンションを使用する際には、プロパティ設定に quarkus.container-image.build=true を追加しないことを強くお勧めします。代わりにビルドコマンドのオプションとして渡すことをお勧めします。
|
ビルド
プロジェクト用のコンテナーイメージを作成するには、Quarkus がサポートしている方法のいずれかで、 quarkus.container-image.build=true を設定する必要があります。
quarkus build -Dquarkus.container-image.build=true
./mvnw install -Dquarkus.container-image.build=true
./gradlew build -Dquarkus.container-image.build=true
ネイティブコンテナイメージをビルドしたいときに、すでに既存のネイティブイメージがある場合は、 -Dquarkus.native.reuse-existing=true を設定すれば、ネイティブイメージのビルドは再実行されません。
|
@QuarkusIntegrationTest の利用
作成されたイメージでテストを実行するためには、Quarkus がサポートしている方法のいずれかで、 quarkus.container-image.build=true を設定する必要があります。
./mvnw verify -Dquarkus.container-image.build=true
./gradlew quarkusIntTest -Dquarkus.container-image.build=true
プッシュ
プロジェクトにコンテナーイメージをプッシュするには、Quarkus がサポートしている方法のいずれかで、 quarkus.container-image.push=true を設定する必要があります。
quarkus build -Dquarkus.container-image.push=true
./mvnw install -Dquarkus.container-image.push=true
./gradlew build -Dquarkus.container-image.push=true
レジストリーが設定されていない場合 (quarkus.container-image.registry を使用) は、 docker.io がデフォルトとして使用されます。
|
複数のエクステンションから選択する
複数のエクステンションを同じビルドの一部として使用することは意味がありません。複数のコンテナイメージエクステンションが存在する場合は、エラーが発生してユーザーに通知されます。ユーザーは、不要なエクステンションを削除するか、 application.properties を使用してエクステンションを選択することができます。
例えば、 container-image-docker と container-image-s2i の両方が存在し、ユーザーが container-image-docker を使用する場合:
quarkus.container-image.builder=docker
カスタマイズ
以下のプロパティーを使用して、コンテナーイメージのビルドプロセスをカスタマイズすることができます。
コンテナーイメージオプション
ビルド時に固定される設定プロパティ - 他のすべての設定プロパティは実行時にオーバーライド可能
タイプ |
デフォルト |
|
|---|---|---|
The group the container image will be part of Environment variable: Show more |
string |
|
The name of the container image. If not set defaults to the application name Environment variable: Show more |
string |
|
The tag of the container image. If not set defaults to the application version Environment variable: Show more |
string |
|
Additional tags of the container image. Environment variable: Show more |
文字列のリスト |
|
The container registry to use Environment variable: Show more |
string |
|
Represents the entire image string. If set, then Environment variable: Show more |
string |
|
The username to use to authenticate with the registry where the built image will be pushed Environment variable: Show more |
string |
|
The password to use to authenticate with the registry where the built image will be pushed Environment variable: Show more |
string |
|
Whether or not insecure registries are allowed Environment variable: Show more |
boolean |
|
Whether or not a image build will be performed. Environment variable: Show more |
boolean |
|
Whether or not an image push will be performed. Environment variable: Show more |
boolean |
|
The name of the container image extension to use (e.g. docker, jib, s2i). The option will be used in case multiple extensions are present. Environment variable: Show more |
string |
|
Custom labels to add to the generated image. Environment variable: Show more |
|
CI 環境の利用
さまざまな CI 環境では、Quarkus アプリケーションを作成してレジストリーをプッシュするために、コンテナーイメージ Quarkus エクステンションと組み合わせることで、すぐに使えるコンテナーイメージレジストリ-を利用できます。
例えば、 GitLab はこのようなレジストリーを提供しており、提供されている CI 環境では、環境変数 CI_REGISTRY_IMAGE (詳しくは GitLab の ドキュメント を参照) を利用できるようになっています。なお、Quarkus ではこのように利用できます。
quarkus.container-image.image=${CI_REGISTRY_IMAGE}
| プロパティと環境変数を組み合わせる方法については、 こちらをご覧ください。 |
Jib オプション
一般的なコンテナーイメージのオプションに加えて、 container-image-jib では以下のオプションも用意されています。
ビルド時に固定される設定プロパティ - 他のすべての設定プロパティは、実行時にオーバーライド可能
タイプ |
デフォルト |
|
|---|---|---|
The base image to be used when a container image is being produced for the jar build. When the application is built against Java 17 or higher, Environment variable: Show more |
string |
|
The base image to be used when a container image is being produced for the native binary build. The default is "quay.io/quarkus/quarkus-micro-image". You can also use "registry.access.redhat.com/ubi8/ubi-minimal" which is a bigger base image, but provide more built-in utilities such as the microdnf package manager. Environment variable: Show more |
string |
|
The JVM arguments to pass to the JVM when starting the application Environment variable: Show more |
文字列のリスト |
|
Additional JVM arguments to pass to the JVM when starting the application Environment variable: Show more |
文字列のリスト |
|
Additional arguments to pass when starting the native application Environment variable: Show more |
文字列のリスト |
|
If this is set, then it will be used as the entry point of the container image. There are a few things to be aware of when creating an entry point
- Entrypoint "INHERIT" means to inherit entrypoint from base image, Environment variable: Show more |
文字列のリスト |
|
If this is set, then it will be used as the entry point of the container image. There are a few things to be aware of when creating an entry point
- Entrypoint "INHERIT" means to inherit entrypoint from base image, Environment variable: Show more |
文字列のリスト |
|
The username to use to authenticate with the registry used to pull the base JVM image Environment variable: Show more |
string |
|
The password to use to authenticate with the registry used to pull the base JVM image Environment variable: Show more |
string |
|
list of int |
|
|
The user to use in generated image Environment variable: Show more |
string |
|
The working directory to use in the generated image. The default value is chosen to work in accordance with the default base image. Environment variable: Show more |
string |
|
Controls the optimization which skips downloading base image layers that exist in a target registry. If the user does not set this property, then read as false. If Environment variable: Show more |
boolean |
|
List of target platforms. Each platform is defined using the pattern: Environment variable: Show more |
文字列のリスト |
|
The path of a file in which the digest of the generated image will be written. If the path is relative, the base path is the output directory of the build tool. Environment variable: Show more |
string |
|
The path of a file in which the id of the generated image will be written. If the path is relative, the base path is the output directory of the build tool. Environment variable: Show more |
string |
|
Whether or not to operate offline. Environment variable: Show more |
boolean |
|
Name of binary used to execute the docker commands. This is only used by Jib when the container image is being built locally. Environment variable: Show more |
string |
|
Whether to set the creation time to the actual build time. Otherwise, the creation time will be set to the Unix epoch (00:00:00, January 1st, 1970 in UTC). See Jib FAQ for more information Environment variable: Show more |
boolean |
|
Whether to set the modification time (last modified time) of the files put by Jib in the image to the actual build time. Otherwise, the modification time will be set to the Unix epoch (00:00:00, January 1st, 1970 in UTC). If the modification time is constant (flag is set to false so Unix epoch is used) across two consecutive builds, the docker layer sha256 digest will be different only if the actual files added by Jib to the docker layer were changed. More exactly, having 2 consecutive builds will generate different docker layers only if the actual content of the files within the docker layer was changed. If the current timestamp is used the sha256 digest of the docker layer will always be different even if the content of the files didn’t change. Environment variable: Show more |
boolean |
|
Environment variables to add to the container image Environment variable: Show more |
|
|
Sets environment variables used by the Docker executable. This is only used by Jib when the container image is being built locally. Environment variable: Show more |
|
Docker オプション
一般的なコンテナーイメージのオプションに加えて、 container-image-docker では以下のオプションも用意されています。
ビルド時に固定される設定プロパティ - 他のすべての設定プロパティは、実行時にオーバーライド可能
タイプ |
デフォルト |
|
|---|---|---|
Path to the JVM Dockerfile. If not set ${project.root}/src/main/docker/Dockerfile.jvm will be used If set to an absolute path then the absolute path will be used, otherwise the path will be considered relative to the project root Environment variable: Show more |
string |
|
Path to the JVM Dockerfile. If not set ${project.root}/src/main/docker/Dockerfile.native will be used If set to an absolute path then the absolute path will be used, otherwise the path will be considered relative to the project root Environment variable: Show more |
string |
|
Images to consider as cache sources. Values are passed to Environment variable: Show more |
文字列のリスト |
|
Environment variable: |
string |
|
Name of binary used to execute the docker commands. This setting can override the global container runtime detection. Environment variable: Show more |
string |
|
Build args passed to docker via Environment variable: Show more |
|
|
タイプ |
デフォルト |
|
Which platform(s) to target during the build. See https://docs.docker.com/engine/reference/commandline/buildx_build/#platform Environment variable: Show more |
文字列のリスト |
|
Sets the export action for the build result. See https://docs.docker.com/engine/reference/commandline/buildx_build/#output. Note that any filesystem paths need to be absolute paths, not relative from where the command is executed from. Environment variable: Show more |
string |
|
Set type of progress output ( Environment variable: Show more |
string |
S2I オプション
一般的なコンテナーイメージのオプションに加えて、 container-image-s2i では以下のオプションも用意されています。
ビルド時に固定される設定プロパティ - 他のすべての設定プロパティは、実行時にオーバーライド可能
タイプ |
デフォルト |
|
|---|---|---|
The base image to be used when a container image is being produced for the jar build Environment variable: Show more |
string |
|
The base image to be used when a container image is being produced for the native binary build Environment variable: Show more |
string |
|
The JVM arguments to pass to the JVM when starting the application Environment variable: Show more |
文字列のリスト |
|
Additional JVM arguments to pass to the JVM when starting the application Environment variable: Show more |
文字列のリスト |
|
Additional arguments to pass when starting the native application Environment variable: Show more |
文字列のリスト |
|
The directory where the jar is added during the assemble phase. This is dependent on the S2I image and should be supplied if a non default image is used. Environment variable: Show more |
string |
|
The resulting filename of the jar in the S2I image. This option may be used if the selected S2I image uses a fixed name for the jar. Environment variable: Show more |
string |
|
The directory where the native binary is added during the assemble phase. This is dependent on the S2I image and should be supplied if a non-default image is used. Environment variable: Show more |
string |
|
The resulting filename of the native binary in the S2I image. This option may be used if the selected S2I image uses a fixed name for the native binary. Environment variable: Show more |
string |
|
The build timeout. Environment variable: Show more |
|
|
期間フォーマットについて
期間のフォーマットは標準の 数値で始まる期間の値を指定することもできます。この場合、値が数値のみで構成されている場合、コンバーターは値を秒として扱います。そうでない場合は、 |