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 データベースのバックアップをスケジュールするいくつかの方法 (包括的)
>>: 今日、私は非常に奇妙なクリックの問題に遭遇し、自分で解決しました
この記事では、画像の切り取りとアップロードを実装するためのvue-cropperコンポーネントの具体...
ご存知のとおり、cd コマンドがないと、Linux でディレクトリを切り替えることはできません。それ...
序文binlog は、MySQL のすべての追加、削除、および変更ステートメントを記録するバイナリ ...
Ubuntu 20.04 がリリースされ、多くの新機能が導入されましたが、慣れていない機能も多くあ...
マスターのメソッドによると、原因は sysctl net.ipv4.ip_forward であること...
Web ページを設計する過程で、デザイナーが間違いを犯すのは必然です。特に新人は、新しいアイデアを実...
目次1. ノード、ツリー、仮想DOM 2. 仮想DOM 2.1 データオブジェクトの詳細2.2 制約...
目次js の1. グローバルガードを登録する2. Vuex 状態管理グローバルキャッシュルート3. ...
目次1. スコープはさまざまな方法で表現されます2. 変動昇進と非昇進の違い3. 一時的なデッドゾー...
1. muttをインストールするsudo apt-get install mutt 2. msmtp...
目次1. 親コンポーネントが子コンポーネントにデータを渡す1.1. 親コンポーネントコード1.2. ...
1. xshell を使用して仮想マシンに接続するか、仮想マシンに直接コマンドを入力します。以下はx...
目次1. SQL最適化の一般的な手順1. SQL実行計画の分析を説明する2. プロフィール分析を表示...
Portainer は、Docker ホストと Docker Swarm クラスターの管理に使用でき...
この記事の例では、スライダー間隔コンポーネントを実装するためのjsの具体的なコードを参考までに共有し...