SpringBootを使用してdockerイメージを作成します

前書き

昔、Spring Bootのドッカーイメージをどのように作成しましたか?最も一般的な方法は、Springブートアプリケーションをファットジャーにパッケージ化してから、ドッカーファイルを作成し、ファットジャーをドッカーイメージにして実行することです。

今日は、Spring Boot2.3.3によってもたらされるドッカーイメージをすばやく作成する機能を体験してみましょう。

伝統的な慣習とその欠点

次に、非常に単純なSpringBootプログラムを作成します。

@SpringBootApplication
@RestController
public class Application {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(Application.class, args);
    }

    @GetMapping("/getInfo")
    public String getInfo() {
    
    
        return "www.flydean.com";
    }
}

デフォルトでは、ファットjarを作成します:springboot-with-docker-0.0.1-SNAPSHOT.jar

解凍してその内容を見てみましょう:

Springブートのファットジャーは3つの部分に分かれています。最初の部分はBOOT-INFです。内部のクラスディレクトリには、作成したクラスファイルが含まれています。libディレクトリには、プロジェクトが依存する他のjarパッケージが格納されます。

2番目の部分はMETA-INFで、jarパッケージの属性情報を定義します。

3番目の部分はSpringBootクラスローダーです。fatjarパッケージは、Spring BootのjarLauncherを介してLaunchedURLClassLoaderを作成することによって開始され、libの下のjarパッケージがロードされ、最後にアプリケーションのMain関数が新しいスレッドで開始されます。

ここでSpringBootの起動について話すことはあまりありません。

この太い瓶を使ってドッカー画像を作成したい場合は、次のように書いてみましょう。

FROM openjdk:8-jdk-alpine
EXPOSE 8080
ARG JAR_FILE=target/springboot-with-docker-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

この書き込みには2つの問題があります。

最初の質問:far jarを使用しています。farjarを使用するプロセスには特定のパフォーマンスの問題があり、特にコンテナ環境で実行している場合は、解凍後のパフォーマンスよりも明らかに低くなります。目立つ。

2番目の質問:dockerの画像はレイヤーごとに作成されることがわかっています。レイヤーごとに作成する利点は、画像の作成時間を短縮し、前のレイヤーを再利用できることです。

ただし、fat jarパッケージを使用する場合は、独自のコードを変更するだけでも、fat jar全体が再更新され、dockerイメージのビルド速度に影響します。

ビルドパックを使用する

上記の2つの問題に加えて、従来の方法は、ドッカーファイルを自分で作成することですが、ワンクリックでドッカーイメージを作成する方法はありますか?

答えはイエスです。

Spring Bootは、2.3.0以降にCloud Nativeビルドパックを導入しました。このツールを使用すると、ドッカーイメージを非常に便利に作成できます。

MavenとGradleで、Spring Bootは新しいフェーズを導入しました:sp​​ring-boot:build-image

直接実行できます:

 mvn  spring-boot:build-image

実行すると、残念ながら、次のエラーが発生する可能性があります。

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) on project springboot-with-docker: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image failed: Docker API call to 'localhost/v1.24/images/create?fromImage=gcr.io%2Fpaketo-buildpacks%2Fbuilder%3Abase-platform-api-0.3' failed with status code 500 "Internal Server Error" and message "Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)" -> [Help 1]

これは、gcr.ioからミラーをプルできないためです。

オンラインにする方法を知っていれば、エージェントを見つけたと思います。

プロキシをDockerのプロキシアイテムに設定します。Dockerデスクトップを使用しています。設定は次のとおりです。

mvn spring-boot:build-imageを再実行します

実行結果を待ちます。

[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ springboot-with-docker ---
[INFO] Building image 'docker.io/library/springboot-with-docker:0.0.1-SNAPSHOT'
[INFO] 
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%

ご覧のとおり、gcr.ioから画像をプルする必要があります。

レイヤードジャー

Cloud Native Buildpackを使用したくない場合でも、従来のDockerfileを使用する必要があります。それは問題ではありません、SpringBootは私たちにユニークなレイヤードジャーパッケージングシステムを提供します。

オンにする方法は?次の構成をPOMファイルに追加する必要があります。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layers>
                        <enabled>true</enabled>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>

もう一度パッケージして、jarパッケージの内容を確認します。

追加のlayer.idxインデックスファイルがあることを除いて、以前のjarパッケージと同じように見えます。

- "dependencies":
  - "BOOT-INF/lib/"
- "spring-boot-loader":
  - "org/"
- "snapshot-dependencies":
- "application":
  - "BOOT-INF/classes/"
  - "BOOT-INF/classpath.idx"
  - "BOOT-INF/layers.idx"
  - "META-INF/"

インデックスファイルは主に4つの部分に分かれています。

  • 依存関係-SNAPSHOTに依存しないjarパッケージ
  • スナップショット-依存関係-SNAPSHOT依存関係jarパッケージ
  • spring-boot-loader-Springboot的クラスローダー文件
  • アプリケーション-アプリケーションクラスおよびリソースファイル

ここでのインデックスファイルは順番になっていることに注意してください。これは、ドッカーイメージに追加するレイヤーの順序と一致しています。

変更が最も少ないものが最初にレイヤーに追加され、変更が最も大きいものが最後のレイヤーに配置されます。

layertools jarmodeを使用して、生成されたファットjarを検証または解凍できます。

java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar 
Usage:
  java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar

Available commands:
  list     List layers from the jar that can be extracted
  extract  Extracts layers from the jar for image creation
  help     Help about any command

listコマンドを使用して、jarパッケージ内のレイヤー情報を一覧表示できます。抽出を使用して、さまざまなレイヤーを解凍できます。

extractコマンドを実行して、結果を確認します。

ご覧のとおり、layers.idxに従ってさまざまなフォルダーを抽出しました。

レイヤーを使用してdockerFileを作成する方法を見てみましょう。

FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

このようにして、私たちの階層化されたDockerImageが作成されます。

カスタムレイヤー

レイヤーをカスタマイズする必要がある場合はどうなりますか?

別のlayers.xmlファイルを作成できます。

<layers xmlns="http://www.springframework.org/schema/boot/layers"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
              https://www.springframework.org/schema/boot/layers/layers-2.3.xsd">
    <application>
        <into layer="spring-boot-loader">
            <include>org/springframework/boot/loader/**</include>
        </into>
        <into layer="application" />
    </application>
    <dependencies>
        <into layer="snapshot-dependencies">
            <include>*:*:*SNAPSHOT</include>
        </into>
        <into layer="company-dependencies">
            <include>com.flydean:*</include>
        </into>
        <into layer="dependencies"/>
    </dependencies>
    <layerOrder>
        <layer>dependencies</layer>
        <layer>spring-boot-loader</layer>
        <layer>snapshot-dependencies</layer>
        <layer>company-dependencies</layer>
        <layer>application</layer>
    </layerOrder>
</layers>

このlayer.xmlの使い方は?

ビルドプラグインに追加するだけです。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layers>
                        <enabled>true</enabled>
                        <configuration>${project.basedir}/src/main/resources/layers.xml</configuration>
                    </layers>
                </configuration>
            </plugin>
        </plugins>
    </build>

この記事の例:springboot-with-docker

著者:flydeanプログラムそれらのもの

この記事へのリンク:http//www.flydean.com/springboot-docker-image/

この記事の出典:flydeanのブログ

私の公式アカウントに注目してください:「プログラム」の最も人気のある解釈、最も深遠な乾物、最も簡潔なチュートリアル、そしてあなたが知らない多くのヒントがあなたが発見するのを待っています!

おすすめ

転載: blog.csdn.net/superfjj/article/details/109091776