Production Readyなコンテナイメージには上記に挙げたような事項を考慮したDockerfileが必要であり、これを作成、メンテナンスしていくには高いスキルセットが必要ですし、相当な労力と工数もかかってきます。これらを解消するソリューションとして期待しているのが、「Cloud Native Buildpacks」や「Jib」といったツールです。
# bootBuildImageタスクを実行
./gradlew bootBuildImage
# 実行ログ
-----
> Task :bootBuildImage
Building image 'docker.io/cnb/coe-sample-app:v0.0.1'
> Pulling builder image 'docker.io/paketobuildpacks/builder-jammy-base:latest' ..................................................
> Pulled builder image 'paketobuildpacks/builder-jammy-base@sha256:8f7f43bacc30ce986fadb98ab551ee912002fe517f9761cabe1d4c96d373159e'
> Pulling run image 'docker.io/paketobuildpacks/run-jammy-base:latest' ..................................................
> Pulled run image 'paketobuildpacks/run-jammy-base@sha256:bba1573aca3b46c56ab47ee38f98cbc637985f46139afb9e068c90e2c91eef9f'
> Pulling buildpack image 'gcr.io/paketo-buildpacks/adoptium:latest' ..................................................
> Pulled buildpack image 'gcr.io/paketo-buildpacks/adoptium@sha256:8578f06a93d907252865ffe4613a5d6c0fc57a301f48da35e1efd9dfb1774207'
> Pulling buildpack image 'docker.io/paketobuildpacks/java:latest' ..................................................
> Pulled buildpack image 'paketobuildpacks/java@sha256:8e334f314d85e8fe4027ec7b1b866e3f2b15b80fe3542c268c6329567f8560ea'
> Executing lifecycle version v0.20.4
> Using build cache volume 'pack-cache-b61d5c977007.build'
> Running creator
[creator] ===> ANALYZING
[creator] Image with name "docker.io/cnb/coe-sample-app:v0.0.1" not found
[creator] ===> DETECTING
[creator] target distro name/version labels not found, reading /etc/os-release file
[creator] target distro name/version labels not found, reading /etc/os-release file
[creator] 7 of 27 buildpacks participating
[creator] paketo-buildpacks/adoptium 12.0.0
[creator] paketo-buildpacks/ca-certificates 3.8.6
[creator] paketo-buildpacks/bellsoft-liberica 11.0.0
[creator] paketo-buildpacks/syft 2.4.0
[creator] paketo-buildpacks/executable-jar 6.11.3
[creator] paketo-buildpacks/dist-zip 5.8.5
[creator] paketo-buildpacks/spring-boot 5.31.2
[creator] ===> RESTORING
[creator] ===> BUILDING
[creator] target distro name/version labels not found, reading /etc/os-release file
[creator]
[creator] Paketo Buildpack for Adoptium 12.0.0
[creator] https://github.com/paketo-buildpacks/adoptium
[creator] Build Configuration:
[creator] $BP_JVM_JLINK_ARGS --no-man-pages --no-header-files --strip-debug --compress=1 configure custom link arguments (--output must be omitted)
[creator] $BP_JVM_JLINK_ENABLED true enables running jlink tool to generate custom JRE
[creator] $BP_JVM_TYPE JRE the JVM type - JDK or JRE
[creator] $BP_JVM_VERSION 21 the Java version
[creator] Launch Configuration:
[creator] $BPL_DEBUG_ENABLED false enables Java remote debugging support
[creator] $BPL_DEBUG_PORT 8000 configure the remote debugging port
[creator] $BPL_DEBUG_SUSPEND false configure whether to suspend execution until a debugger has attached
[creator] $BPL_HEAP_DUMP_PATH write heap dumps on error to this path
[creator] $BPL_JAVA_NMT_ENABLED true enables Java Native Memory Tracking (NMT)
[creator] $BPL_JAVA_NMT_LEVEL summary configure level of NMT, summary or detail
[creator] $BPL_JFR_ARGS configure custom Java Flight Recording (JFR) arguments
[creator] $BPL_JFR_ENABLED false enables Java Flight Recording (JFR)
[creator] $BPL_JMX_ENABLED false enables Java Management Extensions (JMX)
[creator] $BPL_JMX_PORT 5000 configure the JMX port
[creator] $BPL_JVM_HEAD_ROOM 0 the headroom in memory calculation
[creator] $BPL_JVM_LOADED_CLASS_COUNT 35% of classes the number of loaded classes in memory calculation
[creator] $BPL_JVM_THREAD_COUNT 250 the number of threads in memory calculation
[creator] $JAVA_TOOL_OPTIONS the JVM launch flags
[creator] Using Java version 21 extracted from MANIFEST.MF
[creator] Adoptium JDK 21.0.5: Contributing to layer
[creator] Downloading from https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz
[creator] Verifying checksum
[creator] Expanding to /layers/paketo-buildpacks_adoptium/jdk
[creator] Adding 146 container CA certificates to JVM truststore
[creator] Writing env.build/JAVA_HOME.override
[creator] Writing env.build/JDK_HOME.override
[creator] JLink: Contributing to layer
[creator] Warning: The 1 argument for --compress is deprecated and may be removed in a future release
[creator] Adding 146 container CA certificates to JVM truststore
[creator] Writing env.launch/BPI_APPLICATION_PATH.default
[creator] Writing env.launch/BPI_JVM_CACERTS.default
[creator] Writing env.launch/BPI_JVM_CLASS_COUNT.default
[creator] Writing env.launch/BPI_JVM_SECURITY_PROVIDERS.default
[creator] Writing env.launch/JAVA_HOME.default
[creator] Writing env.launch/JAVA_TOOL_OPTIONS.append
[creator] Writing env.launch/JAVA_TOOL_OPTIONS.delim
[creator] Writing env.launch/MALLOC_ARENA_MAX.default
[creator] Launch Helper: Contributing to layer
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/java-opts
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/jvm-heap
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/link-local-dns
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/memory-calculator
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/security-providers-configurer
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/jmx
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/jfr
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/openssl-certificate-loader
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/security-providers-classpath-9
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/debug-9
[creator] Creating /layers/paketo-buildpacks_adoptium/helper/exec.d/nmt
[creator] Java Security Properties: Contributing to layer
[creator] Writing env.launch/JAVA_SECURITY_PROPERTIES.default
[creator] Writing env.launch/JAVA_TOOL_OPTIONS.append
[creator] Writing env.launch/JAVA_TOOL_OPTIONS.delim
[creator]
[creator] Paketo Buildpack for CA Certificates 3.8.6
[creator] https://github.com/paketo-buildpacks/ca-certificates
[creator] Build Configuration:
[creator] $BP_EMBED_CERTS false Embed certificates into the image
[creator] $BP_ENABLE_RUNTIME_CERT_BINDING true Deprecated: Enable/disable certificate helper layer to add certs at runtime
[creator] $BP_RUNTIME_CERT_BINDING_DISABLED false Disable certificate helper layer to add certs at runtime
[creator] Launch Helper: Contributing to layer
[creator] Creating /layers/paketo-buildpacks_ca-certificates/helper/exec.d/ca-certificates-helper
[creator]
[creator] Paketo Buildpack for Syft 2.4.0
[creator] https://github.com/paketo-buildpacks/syft
[creator] Downloading from https://github.com/anchore/syft/releases/download/v1.15.0/syft_1.15.0_linux_amd64.tar.gz
[creator] Verifying checksum
[creator] Writing env.build/SYFT_CHECK_FOR_APP_UPDATE.default
[creator]
[creator] Paketo Buildpack for Executable JAR 6.11.3
[creator] https://github.com/paketo-buildpacks/executable-jar
[creator] Class Path: Contributing to layer
[creator] Writing env/CLASSPATH.delim
[creator] Writing env/CLASSPATH.prepend
[creator] Process types:
[creator] executable-jar: java org.springframework.boot.loader.launch.JarLauncher (direct)
[creator] task: java org.springframework.boot.loader.launch.JarLauncher (direct)
[creator] web: java org.springframework.boot.loader.launch.JarLauncher (direct)
[creator]
[creator] Paketo Buildpack for Spring Boot 5.31.2
[creator] https://github.com/paketo-buildpacks/spring-boot
[creator] Build Configuration:
[creator] $BPL_JVM_CDS_ENABLED false whether to enable CDS optimizations at runtime
[creator] $BPL_SPRING_AOT_ENABLED false whether to enable Spring AOT at runtime
[creator] $BP_JVM_CDS_ENABLED false whether to enable CDS & perform JVM training run
[creator] $BP_SPRING_AOT_ENABLED false whether to enable Spring AOT
[creator] $BP_SPRING_CLOUD_BINDINGS_DISABLED false whether to contribute Spring Boot cloud bindings support
[creator] $BP_SPRING_CLOUD_BINDINGS_VERSION 1 default version of Spring Cloud Bindings library to contribute
[creator] Launch Configuration:
[creator] $BPL_SPRING_CLOUD_BINDINGS_DISABLED false whether to auto-configure Spring Boot environment properties from bindings
[creator] $BPL_SPRING_CLOUD_BINDINGS_ENABLED true Deprecated - whether to auto-configure Spring Boot environment properties from bindings
[creator] Creating slices from layers index
[creator] dependencies (18.9 MB)
[creator] spring-boot-loader (406.1 KB)
[creator] snapshot-dependencies (0.0 B)
[creator] application (3.7 KB)
[creator] Spring Cloud Bindings 2.0.3: Contributing to layer
[creator] Downloading from https://repo1.maven.org/maven2/org/springframework/cloud/spring-cloud-bindings/2.0.3/spring-cloud-bindings-2.0.3.jar
[creator] Verifying checksum
[creator] Copying to /layers/paketo-buildpacks_spring-boot/spring-cloud-bindings
[creator] Web Application Type: Contributing to layer
[creator] Servlet web application detected
[creator] Writing env.launch/BPL_JVM_THREAD_COUNT.default
[creator] Launch Helper: Contributing to layer
[creator] Creating /layers/paketo-buildpacks_spring-boot/helper/exec.d/spring-cloud-bindings
[creator] 4 application slices
[creator] Image labels:
[creator] org.opencontainers.image.title
[creator] org.opencontainers.image.version
[creator] org.springframework.boot.version
[creator] ===> EXPORTING
[creator] Adding layer 'paketo-buildpacks/adoptium:JLink'
[creator] Adding layer 'paketo-buildpacks/adoptium:helper'
[creator] Adding layer 'paketo-buildpacks/adoptium:java-security-properties'
[creator] Adding layer 'paketo-buildpacks/ca-certificates:helper'
[creator] Adding layer 'paketo-buildpacks/executable-jar:classpath'
[creator] Adding layer 'paketo-buildpacks/spring-boot:helper'
[creator] Adding layer 'paketo-buildpacks/spring-boot:spring-cloud-bindings'
[creator] Adding layer 'paketo-buildpacks/spring-boot:web-application-type'
[creator] Adding layer 'buildpacksio/lifecycle:launch.sbom'
[creator] Added 5/5 app layer(s)
[creator] Adding layer 'buildpacksio/lifecycle:launcher'
[creator] Adding layer 'buildpacksio/lifecycle:config'
[creator] Adding layer 'buildpacksio/lifecycle:process-types'
[creator] Adding label 'io.buildpacks.lifecycle.metadata'
[creator] Adding label 'io.buildpacks.build.metadata'
[creator] Adding label 'io.buildpacks.project.metadata'
[creator] Adding label 'org.opencontainers.image.title'
[creator] Adding label 'org.opencontainers.image.version'
[creator] Adding label 'org.springframework.boot.version'
[creator] Setting default process type 'web'
[creator] Saving docker.io/cnb/coe-sample-app:v0.0.1...
[creator] *** Images (6c51e8077fba):
[creator] docker.io/cnb/coe-sample-app:v0.0.1
[creator] Adding cache layer 'paketo-buildpacks/adoptium:jdk'
[creator] Adding cache layer 'paketo-buildpacks/syft:syft'
[creator] Adding cache layer 'paketo-buildpacks/spring-boot:spring-cloud-bindings'
[creator] Adding cache layer 'buildpacksio/lifecycle:cache.sbom'
Successfully built image 'docker.io/cnb/coe-sample-app:v0.0.1'
BUILD SUCCESSFUL in 1m 24s
6 actionable tasks: 6 executed
-----
以下のようにイメージが作成されました。
※cnb/coe-sample-app:v0.0.1(CREATEDが44 years agoとなる理由は不明)
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
paketobuildpacks/run-jammy-base latest 28ec68508efa 27 hours ago 104MB
paketobuildpacks/java latest 2f9fcc2a079a 44 years ago 231MB
cnb/coe-sample-app v0.0.1 6c51e8077fba 44 years ago 214MB
paketobuildpacks/builder-jammy-base latest 16b4cb1ca526 44 years ago 1.62GB
gcr.io/paketo-buildpacks/adoptium latest ac5e37e1e8ad 44 years ago 12.1MB
もう一つJavaの起動速度の改善として効果が期待されるのが、「Class Data Sharing(以下CDS)」です。クラスのメタデータをアーカイブファイルにキャッシュし、JVMの起動時にそのキャッシュからクラスを高速に読み込むことで、メモリフットプリントを削減し、起動速度を改善します。Springアプリケーションに対するCDSの効果については、以下記事がVMWareから公開されています。 CDS with Spring Framework 6.1
上記記事によると、CDSを利用することで、かなりの改善につながることが実証されています。
> Task :bootBuildImage
・・・
[creator] Paketo Buildpack for Spring Boot 5.31.2
[creator] https://github.com/paketo-buildpacks/spring-boot
[creator] Build Configuration:
[creator] $BPL_JVM_CDS_ENABLED false whether to enable CDS optimizations at runtime
[creator] $BPL_SPRING_AOT_ENABLED false whether to enable Spring AOT at runtime
[creator] $BP_JVM_CDS_ENABLED true whether to enable CDS & perform JVM training run
[creator] $BP_SPRING_AOT_ENABLED false whether to enable Spring AOT
[creator] $BP_SPRING_CLOUD_BINDINGS_DISABLED false whether to contribute Spring Boot cloud bindings support
[creator] $BP_SPRING_CLOUD_BINDINGS_VERSION 1 default version of Spring Cloud Bindings library to contribute
[creator] Launch Configuration:
[creator] $BPL_SPRING_CLOUD_BINDINGS_DISABLED false whether to auto-configure Spring Boot environment properties from bindings
[creator] $BPL_SPRING_CLOUD_BINDINGS_ENABLED true Deprecated - whether to auto-configure Spring Boot environment properties from bindings
[creator] Spring Cloud Bindings 2.0.3: Reusing cached layer
[creator] Performance: Contributing to layer
[creator] Extracting Jar
[creator]
[creator] . ____ _ __ _ _
[creator] /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
[creator] ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
[creator] \\/ ___)| |_)| | | | | || (_| | ) ) ) )
[creator] ' |____| .__|_| |_|_| |_\__, | / / / /
[creator] =========|_|==============|___/=/_/_/_/
[creator]
[creator] :: Spring Boot :: (v3.3.4)
[creator]
・・・
さて、これだけで結構な改善率ですが、Springアプリケーションの場合、CDSに「Ahead Of Time コンパイラ(以下AOT)」を組み合わせ使用することができます。AOTは事前に必要なクラス情報を静的に最適化した上でコンパイルするため、起動速度の大幅な改善が期待できます。使用するには「Spring AOTプラグイン」を指定し、実行時の環境変数に「BP_SPRING_AOT_ENABLED」を有効にします。
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.4'
id 'org.springframework.boot.aot' version '3.3.4' ←追加
id 'io.spring.dependency-management' version '1.1.6'
}
・・・
//#CNBのビルド設定
bootBuildImage {
・・・
environment = [
・・・
"BP_JVM_CDS_ENABLED" : "true",
"BP_SPRING_AOT_ENABLED" : "true" ←追加
・・・
]
}
以下が実行結果です。
CDS + Spring AOT
・・・
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx457574K -XX:MaxMetaspaceSize=79001K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 1G, Thread Count: 250, Loaded Class Count: 11534, Headroom: 0%)
Enabling Java Native Memory Tracking
Adding 146 container CA certificates to JVM truststore
Spring AOT Enabled, contributing -Dspring.aot.enabled=true to JAVA_TOOL_OPTIONS
Spring CDS Enabled, contributing -XX:SharedArchiveFile=application.jsa to JAVA_TOOL_OPTIONS
Spring Cloud Bindings Enabled
Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_adoptium/java-security-properties/java-security.properties -XX:+ExitOnOutOfMemoryError -XX:MaxDirectMemorySize=10M -Xmx457574K -XX:MaxMetaspaceSize=79001K -XX:ReservedCodeCacheSize=240M -Xss1M -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics -Dspring.aot.enabled=true -XX:SharedArchiveFile=application.jsa -Dorg.springframework.cloud.bindings.boot.enable=true
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.4)
・・・
Starting AOT-processed Application v0.0.3 using Java 21.0.5 with PID 1 (/workspace/runner.jar started by cnb in /workspace)
・・・
Started Application in 1.098 seconds (process running for 1.364)