Dockerfiles

Dockerfile に数行追加するだけで、Spring Boot uber jar を Docker イメージに変換できますが、レイヤー化機能を使用すると、最適化されたイメージが作成されます。レイヤーインデックスファイルを含む jar を作成すると、spring-boot-jarmode-tools jar が jar への依存関係として追加されます。クラスパスにこの jar を追加すると、ブートストラップコードでアプリケーションとはまったく異なるもの (レイヤーを抽出するものなど) を実行できる特別なモードでアプリケーションを起動できます。

tools モードは、起動スクリプトを含む完全に実行可能な Spring Boot アーカイブでは使用できません。layertools で使用することを目的とした jar ファイルをビルドするときは、起動スクリプト構成を無効にします。

tools jar モードで jar を起動する方法は次のとおりです。

$ java -Djarmode=tools -jar my-app.jar

これにより、次の出力が提供されます。

Usage:
  java -Djarmode=tools -jar my-app.jar

Available commands:
  extract      Extract the contents from the jar
  list-layers  List layers from the jar that can be extracted
  help         Help about any command

extract コマンドを使用すると、アプリケーションをレイヤーに簡単に分割して、Dockerfile に追加できます。以下は、jarmode を使用した Dockerfile の例です。

FROM bellsoft/liberica-runtime-container:jre-17-cds-slim-glibc as builder
WORKDIR /builder
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted

FROM bellsoft/liberica-runtime-container:jre-17-cds-slim-glibc
WORKDIR /application
COPY --from=builder /builder/extracted/dependencies/ ./
COPY --from=builder /builder/extracted/spring-boot-loader/ ./
COPY --from=builder /builder/extracted/snapshot-dependencies/ ./
COPY --from=builder /builder/extracted/application/ ./
ENTRYPOINT ["java", "-jar", "application.jar"]

上記の Dockerfile が現在のディレクトリにあると仮定すると、docker build . を使用して Docker イメージを構築できます。または、次の例に示すように、アプリケーション jar へのパスをオプションで指定できます。

$ docker build --build-arg JAR_FILE=path/to/myapp.jar .

これはマルチステージの Dockerfile です。ビルダーステージでは、後で必要になるディレクトリを抽出します。各 COPY コマンドは、jarmode によって抽出されたレイヤーに関連しています。

もちろん、Dockerfile は jarmode を使用せずに記述できます。unzip と mv の組み合わせを使用して適切なレイヤーに移動することもできますが、jarmode を使用するとそれが簡単になります。さらに、jarmode によって作成されたレイアウトは、そのままでも CDS フレンドリーです。