「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Buildpacksを使用したSpring BootアプリケーションのDockerイメージの作成

Buildpacksを使用したSpring BootアプリケーションのDockerイメージの作成

2024 年 11 月 5 日に公開
ブラウズ:709

Creating Docker Image of Spring Boot Application using Buildpacks

導入

Spring Boot アプリケーションが作成されました。ローカル マシンでは問題なく動作していますが、今度はアプリケーションを別の場所にデプロイする必要があります。一部のプラットフォームでは、jar ファイルを直接送信すると、それがデプロイされます。場所によっては、仮想マシンを起動し、そこにソース コードをダウンロードしてビルドし、実行することができます。ただし、ほとんどの場合、コンテナーを使用してアプリケーションをデプロイする必要があります。ほとんどの場合、Docker はコンテナー内でイメージを構築して実行するために使用されます。また、jar ファイルを一部のプラットフォームにアップロードすると、アプリケーションは内部のコンテナ内で実行されます。

したがって、このブログでは、特定の Spring Boot アプリケーション用の Docker イメージを構築する 3 つの異なる方法を見ていきます。始めましょう:

基本的なコンテナイメージ

あらゆるアプリケーションの Docker イメージを構築する単純かつ不十分な方法は、イメージ内の jar ファイルをコピーし、java -jar コマンドを使用して実行する単純な Dockerfile を使用することです。

Dockerfileの作成

プロジェクトのルートに置くことができる Dockerfile は次のとおりです:

FROM eclipse-temurin:21-jre-ubi9-minimal

ARG JAR_FILE

COPY ${JAR_FILE} application.jar

ENTRYPOINT ["java", "-jar", "/application.jar"]

使用する jar ファイルの場所である 1 つの引数 JAR_FILE を指定しました。

Docker イメージの構築

上記の Dockerfile を作成した後、以下の手順を使用して Docker イメージを作成します。

  1. Spring Boot プロジェクトの jar ファイルをビルドします:

    ./gradlew bootJar # For Gradle build system
    

    または

    ./mvnw spring-boot:build-jar # For Maven build system
    
  2. Dockerfile を使用して、最新の jar ファイルを使用して Docker イメージを構築します。以下のコマンドでは、{IMAGE_NAME} を必要なイメージ名に置き換え、{JAR_FILE} を生成された jar ファイルへのパスに置き換えます。イメージ名には、-mycompany/product-service:0.0.1-SNAPSHOT:
    のようなタグも含まれています。

    docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
    
  3. 次のコマンドを使用して、Docker イメージがビルドされたかどうかを確認します。上記のコマンドで指定した名前の画像が表示されるはずです:

    docker images
    

レイヤード Jar を使用した効率的なコンテナ イメージ

Spring Boot uber jar を Docker イメージとしてパッケージ化することは可能かつ簡単ですが (前の方法で説明したように)、ファット jar をそのまま Docker イメージにコピーして実行することには多くの欠点があります。例えば、

  • 解凍せずに uber jar を実行すると、余分なオーバーヘッドが発生します。
  • アプリケーションのコードとそのすべての依存関係を 1 つのレイヤーに配置するのは最適ではありません。

Spring Boot バージョンをアップグレードするよりもコードをコンパイルする頻度が高いため、物事をもう少し分離することをお勧めします。これらの jar ファイル (めったに変更されない) をアプリケーション層の前の層に配置すると、Docker は多くの場合、最下層のみを変更する必要があり、残りはキャッシュから選択できます。

階層化された Jar を有効にする

階層化された Docker イメージを作成するには、まず階層化された jar を作成する必要があります。現在、Gradle と Maven ではデフォルトで有効になっています。次の設定を使用して、階層化された jar の動作を有効または無効にできます:

// build.gradle
tasks.named("bootJar") {
    layered {
        enabled = false
    }
}
// build.gradle.kts
tasks.named("bootJar") {
   layered {
      enabled.set(false)
   }
}


   
      
         
            org.springframework.boot
            spring-boot-maven-plugin
            
               
                  true
               
            
         
      
   

レイヤーの作成方法を調整することもできます。 Gradle または Maven の設定についてはドキュメントを参照してください。

Dockerfileの作成

以下は Dockerfile です。これを使用すると、階層化された jar を利用し、Spring Boot アプリケーションの階層化された Docker イメージを作成できます。

# Perform the extraction in a separate builder container
FROM eclipse-temurin:21-jre-ubi9-minimal 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 eclipse-temurin:21-jre-ubi9-minimal

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"]

Docker イメージの構築

階層化された Docker イメージを構築する手順は、基本的な Docker イメージを構築する手順と同じです。そちらをご参照ください。

クラウドネイティブビルドパック

Dockerfile を作成せずに Docker イメージを作成できると言ったらどうなるでしょうか? Cloud Native Buildpack を使用して、Gralde または Maven プラグインから直接 Docker イメージをビルドできます。一部のプラットフォーム (Heraku や Cloud Foundry など) は、Buildpack を使用して、提供された jar ファイルを実行可能なイメージに変換します。

Spring Boot には、Maven および Gradle に対する直接のビルドパック サポートが含まれています。追加のプラグインを含める必要はありません。以下のコマンドを実行するだけです:

./gradlew bootBuildImage # For gradle build system

または

./mvnw spring-boot:build-image # For maven build system

上記のコマンドは、デフォルト名 {PROJECT_NAME}:${PROJECT_VERSION} のイメージを生成します。生成されたイメージの名前を設定したい場合は、以下の手順に従ってください:

Gradle ビルド システムのイメージ名を構成する

次のように、bootBuildImage タスクを構成してイメージの名前を設定できます:

// For build.gradle.kts
val imagePrefix = "javarush"
val dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName.set("${imagePrefix}/${dockerImageName}:${version}")
}
// For build.gradle
def imagePrefix = "javarush"
def dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName = "${imagePrefix}/${dockerImageName}:${version}"
}

Maven ビルド システムのイメージ名の構成

次のように、別のイメージ名を使用するように spring-boot-maven-plugin を設定できます:


   javarush


...


    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        ${imagePrefix}/${project.artifactId}:${project.version}
                    
                
            
        
    

コマンドの実行中にイメージ名を構成します

イメージを構築するコマンドの実行中にイメージの名前を定義することもできます。

./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system

Gradle または Maven プラグインをさらに構成するためのドキュメントを参照できます。
これは、Spring Boot アプリケーションの Docker イメージを作成するための私の頼りになる方法です。

Dockerコンテナの実行

Docker イメージを作成したら、それが期待どおりに動作することを確認する必要があります。イメージが作成されたことを確認したら、docker run コマンドを使用して直接実行できます。例えば、

docker run -p "8080:8080" {IMAGE_NAME}

しかし、これは実稼働アプリケーションでの画像の使用方法ではありません。 Docker Compose は、複数の Docker イメージを実行および管理するために使用されます。

結論

このブログでは、さまざまな方法を使用して Spring Boot アプリケーション用の Docker イメージを構築する方法について説明しました。アプリの Docker イメージを構築できることは、イメージが配信されるものであるため、知っておく必要があるスキルです。最後まで記事を読んでいただきありがとうございます。それは有り難いです。次でお会いしましょう。いつものように、フィードバックや提案は大歓迎です。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/himanshu-pareek/creating-docker-image-of-spring-boot-application-using-buildpacks-5dbo?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3