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
の例です。
# Perform the extraction in a separate builder container
FROM bellsoft/liberica-openjre-debian:17-cds AS builder
WORKDIR /builder
# This points to the built jar file in the target folder
# Adjust this to 'build/libs/*.jar' if you're using Gradle
ARG JAR_FILE=target/*.jar
# Copy the jar file to the working directory and rename it to application.jar
COPY ${JAR_FILE} application.jar
# Extract the jar file using an efficient layout
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted
# This is the runtime container
FROM bellsoft/liberica-openjre-debian:17-cds
WORKDIR /application
# Copy the extracted jar contents from the builder container into the working directory in the runtime container
# Every copy step creates a new docker layer
# This allows docker to only pull the changes it really needs
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/ ./
# Start the application jar - this is not the uber jar used by the builder
# This jar only contains application code and references to the extracted jar files
# This layout is efficient to start up and CDS friendly
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 フレンドリーです。
CDS
さらに CDS を有効にしたい場合は、次の Dockerfile
を使用できます。
# Perform the extraction in a separate builder container
FROM bellsoft/liberica-openjre-debian:17-cds AS builder
WORKDIR /builder
# This points to the built jar file in the target folder
# Adjust this to 'build/libs/*.jar' if you're using Gradle
ARG JAR_FILE=target/*.jar
# Copy the jar file to the working directory and rename it to application.jar
COPY ${JAR_FILE} application.jar
# Extract the jar file using an efficient layout
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted
# This is the runtime container
FROM bellsoft/liberica-openjre-debian:17-cds
WORKDIR /application
# Copy the extracted jar contents from the builder container into the working directory in the runtime container
# Every copy step creates a new docker layer
# This allows docker to only pull the changes it really needs
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/ ./
# Execute the CDS training run
RUN java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar application.jar
# Start the application jar with CDS enabled - this is not the uber jar used by the builder
# This jar only contains application code and references to the extracted jar files
# This layout is efficient to start up and CDS friendly
ENTRYPOINT ["java", "-XX:SharedArchiveFile=application.jsa", "-jar", "application.jar"]
これは上記の Dockerfile
とほぼ同じです。最後のステップとして、トレーニング実行を行って CDS アーカイブを作成し、CDS パラメーターを java -jar
に渡します。