I. 概要この記事では、次の方法で Docker イメージをビルドし、各方法のビルド時間を記録して、Docker で Maven プロジェクトをビルドする最も速い方法を紹介します。
各実行の間に、空白行を追加してソース コードを変更します。各部分の間では、以前にビルドされたイメージの再利用を避け、各メソッドのビルド時間をより正確にするために、マルチステージ ビルドの結果としての中間イメージを含むすべてのビルドされたイメージを削除します。以下はテスト用のシンプルな Spring Boot プロジェクトです。 2. 従来の多段階イメージ構築関連する Dockerfile は次のとおりです。 openjdk:11-slim-buster からビルド コピー .mvn .mvn mvnw をコピーします。 pom.xml をコピーします。 コピー src src 実行 ./mvnw -B パッケージ openjdk:11-jre-slim-buster より --from=build target/fast-maven-builds-1.0.jar をコピーします。 エクスポーズ8080 エントリポイント ["java", "-jar", "fast-maven-builds-1.0.jar"] ビルドを実行してみましょう: 時間 DOCKER_BUILDKIT=0 docker build -t fast-maven:1.0 。 環境変数については今は忘れてください。次のセクションで説明します。 5 回の実行の結果は次のとおりです。
3. Buildkitを使用してイメージをビルドする前のコマンドラインでは DOCKER_BUILDKIT 環境変数が使用されており、これは Docker に古いエンジンを使用するように指示する方法です。しばらく Docker を更新していない場合は、それが使用しているエンジンです。現在、BuildKit が新しいデフォルトとして置き換えられました。 BuildKit により、パフォーマンスがいくつか向上します。
新しいエンジンで前のコマンドを再実行してみましょう。 docker build -t fast-maven:1.1 を実行します。 以下は、最初の実行時のコンソール ログからの抜粋です。
同じコマンドを次のように実行すると、出力が若干異なります。
実行間でソース コードが変更されたことに留意してください。変更しないファイル、つまり .mvn、mvnw、pom.xml は BuildKit によってキャッシュされます。しかし、これらのリソースは小さいため、キャッシュしてもビルド時間が大幅に改善されることはありません。
ログをざっと見てみると、ビルドにおける最大のボトルネックは、すべての依存関係 (プラグインを含む) のダウンロードであることがわかりました。これはソース コードを変更するたびに発生するため、BuildKit ではパフォーマンスが向上しません。 4. 依存関係の階層化を使用してイメージを構築する依存関係に焦点を当てる必要があります。これを実現するには、レイヤーを利用してビルドを 2 つのステップに分割します。
各ステップでレイヤーが作成され、2 番目のステップは最初のステップに依存します。 openjdk:11-slim-buster からビルド コピー .mvn .mvn mvnw をコピーします。 pom.xml をコピーします。 実行 ./mvnw -B dependency:go-offline コピー src src 実行 ./mvnw -B パッケージ openjdk:11-jre-slim-buster より --from=build target/fast-maven-builds-1.2.jar をコピーします。 エクスポーズ8080 エントリポイント ["java", "-jar", "fast-maven-builds-1.2.jar"] 注意: オフラインではすべてがダウンロードされるわけではありません。 -o オプション (オフライン用) を使用すると、コマンドは正常に実行されません。これはよく知られている古い間違いです。いずれの場合も、「十分」です。 ビルドを実行してみましょう: docker build -t fast-maven:1.2 を実行します。 最初の実行は通常のビルドよりもはるかに時間がかかります。 0.84秒 ユーザー 1.21秒 システム 1% CPU 2:35.47 合計 ただし、その後のビルドははるかに高速になります。ソース コードを変更すると、第 2 レイヤーにのみ影響し、(ほとんどの) 依存関係のダウンロードはトリガーされません。
5. Buildkit ビルド中にボリュームマウントを使用するレイヤードビルドによりビルド時間が大幅に短縮されますが、それでも問題が残ります。単一の依存関係を変更すると、イメージが依存するレイヤーが無効になるため、すべての依存関係を再度ダウンロードする必要があります。 幸いなことに、BuildKit ではビルド時(実行時だけでなく)にボリュームのマウントが導入されています。利用できるマウントにはいくつかの種類がありますが、ここで注目するのはキャッシュ マウントです。これは実験的な機能なので、明示的にオプトインする必要があります。 Dockerfile は次のようになります。 # 構文=docker/dockerfile:実験的 openjdk:11-slim-buster からビルド コピー .mvn .mvn mvnw をコピーします。 pom.xml をコピーします。 コピー src src # キャッシュを使用してビルドする RUN --mount=type=cache,target=/root/.m2,rw ./mvnw -B package openjdk:11-jre-slim-buster より --from=build target/fast-maven-builds-1.3.jar をコピーします。 エクスポーズ8080 エントリポイント ["java", "-jar", "fast-maven-builds-1.3.jar"] # syntax=docker/dockerfile:experimental は、実験的な機能を有効にするために使用されます。 時間 docker build -t fast-maven:1.3 。 ビルド時間は通常のビルドよりも長くなりますが、レイヤード ビルドよりも短くなります。 0.71秒 ユーザー 1.01秒 システム 1% CPU 1:50.50 合計 次の構成要素はレイヤーと同等です。
6. Mavenデーモンを使用してイメージをビルドするMaven デーモンを使用してイメージを構築するための Dockerfile ファイルの内容は次のとおりです。 openjdk:11-slim-buster からビルド # Maven デーモンの最新バージョンをダウンロードします。https://github.com/mvndaemon/mvnd/releases/download/0.6.0/mvnd-0.6.0-linux-amd64.zip 。 # パッケージインデックスを更新する RUN apt-get update \ # 解凍してインストール && apt-get install unzip \ # 専用フォルダを作成 && mkdir /opt/mvnd \ # 先ほどダウンロードしたmvndファイルを抽出します && mvnd-0.6.0-linux-amd64.zip を解凍します \ # 抽出したアーカイブの内容を先ほど作成したフォルダに移動します && mv mvnd-0.6.0-linux-amd64/* /opt/mvnd コピー .mvn .mvn mvnw をコピーします。 pom.xml をコピーします。 コピー src src # Mavenラッパーの代わりにmvndを使用する RUN /opt/mvnd/bin/mvnd -B package openjdk:11-jre-slim-buster より --from=build target/fast-maven-builds-1.4.jar をコピーします。 エクスポーズ8080 エントリポイント ["java", "-jar", "fast-maven-builds-1.4.jar"] 次のコマンドを使用してイメージをビルドします。 時間 docker build -t fast-maven:1.4 。 ログ出力は次のようになります。
通常のビルド イメージと比べて大きな改善はありません。 VII. 結論すべての実行時間の概要は次のとおりです。
Docker での Maven ビルドのパフォーマンスを高速化することは通常のビルドとは大きく異なり、依存関係のダウンロード速度が制限要因となり、依存関係をキャッシュするにはレイヤーの使用が必要になります。 参考文献https://blog.frankel.ch/faster-maven-builds/2/ これで、Docker で Maven プロジェクトをより速くビルドする方法に関するこの記事は終了です。Docker を使用した Maven プロジェクトの構築の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL データベースのバックアップをスケジュールするいくつかの方法 (包括的)
>>: 今日、私は非常に奇妙なクリックの問題に遭遇し、自分で解決しました
CSS3 背景画像関連互換性: IE9+背景クリップ 背景画像描画領域background-cli...
要件は次のとおりです。ドメイン名の下に複数のサーバーがあります。現在、特定の地域をテストしています。...
この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...
今日会社から課題をもらったのですが、効果図は以下のとおりです。 どのような効果を実現したいかは特に決...
目次序文導入1. 作用機序2. 自然から3. 時計と計算の比較4. メソッドはデータロジックの関係を...
1. redis で使用すると Netty の起動競合が発生するため、***Application ...
目次charとvarcharの違いcharとvarcharの違い上記は、MySQL における cha...
WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...
1. システム環境yum updateアップグレード後のシステムバージョンは[root@yl-web...
すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...
最近、データベースについて学び始めました。最初にやったことは、データベースとは何か、データベースとデ...
この記事の例では、WeChatアプレットマップで使用される具体的な実装コードを参考までに共有していま...
RocketMQ は、Alibaba が設計した分散型のキューベースのメッセージング ミドルウェア...
インデックスの2つの主要なカテゴリ使用されるストレージエンジン: MySQL 5.7 InnoDBク...
privot は、多対多の関係の中間テーブルです。 PT5 フレームワークは自動的に privot ...