私はJavaでダースのサービスについての妥協の大型可否システムを管理します。我々は、これらすべての共有)、およびすべてのコンポーネント/アプリがMavenを使用して構築されていることをJavaのLIBSのコアセットを持っています。各アプリかかわらコアSDKの瓶の外側には、依存関係の独自のセットを持っています。私は最善のアプローチは、建物や内部にドッキングウィンドウを展開の両方にあるかを把握することはできません。理想的には私は多段階ビルドアプローチを使用して、ドッキングウィンドウでライフサイクル全体をしたいです。しかし、私は、依存関係の膨大な数でこれを最適化する方法を見ることができません。
私は2つのアプローチを行うことができますように見えます。
我々の前に、依存関係が一度にフェッチされ、キャッシュ、およびすべてのアプリケーションにアクセスできるようにすることをMavenとCIサーバ(ジェンキンス)上の共通のキャッシュ使用しているとしてビルド。その後、容器の中にだけコピー製品ジャーとそれの依存関係(または脂肪のjar)という各アプリケーションのためのdockerfileを持ち、そして実行するためにそれを設定。このアプローチの欠点は、ビルド自体は開発者やCIサーバ間で異なる可能性があるものだということです。潜在的にちょうどインターネット毎回からDEPSを引っ張って避けるために、ネクサスのようなローカルのMavenキャッシュを使用しますか?しかし、まだ問題が解決しないことのdevのビルドは必ずしもCIビルド環境と一致しないこと。
各プロジェクトのための多段階dockerfileを使用してください。私はこれを試してみた、それは仕事をして、私はそれがあまりにも頻繁にフェッチしないようにキャッシュにMaven依存層を得ることができました。残念ながら、中間ビルド層は、アプリケーションごとに1〜2ギガバイト当たった、と私はデーモンから「ぶら下がり」中間体を除去することはできませんか、すべてのキャッシュが離れて吹いていること。また、重複の途方もない量が、POMSで何かが変化した場合に、各アプリケーションのためにダウンロードする必要が瓶にありますを意味します。(それらはすべて使用のJUnitとのlog4jおよび他の多くの類似点をIE)
私は見ていないよというこの最適を解決する方法はありますか?私は(実行中にいくつかのその焦点は本当に私のために何も解決しない容器内に自分自身をMavenのと)基本的には上記2つのアプローチに焦点を当てることがわかりましたすべてのブログ。私はおそらく、他の優れたソリューションが存在しない場合はオプション1で行く終わる必要があります。
私はstackoverflowのブログに周りのチェックしました、と私は見つけることができるすべては、あなたが本当に1つだけのアプリではなく、それは、依存関係のダウンロードを繰り返さないことが重要となり、これらのスイートを、構築していることを前提としているようです。
私は長い間あなたが設定したとして.m2 /リポジトリのファイルシステムキャッシュを使用するには、OKだと思う--update-snapshots
あなたのMavenビルドでオプションを選択します。あなたがビルド環境ごとに一度だけ、それぞれの.jarをキャッシュしていないアプリケーションごとに一度だから、より良いスケール。さらに、単一の依存性の変化は、あなたがドッキングウィンドウ層キャッシングを使用する場合場合であるキャッシュ全体を、無効になることはありません。
残念ながら、多段階とうまく組み合わせることができないことを現時点で構築しますが、あなたはそれを求めてだけではありません。この問題は、追加要求--volume
ドッキングウィンドウのビルドコマンドにオプションを選択します。この1は Dockerfileで、このような指示を可能にするために求められますRUN --mount=m2repo=/var/mvn/repo mvn install
。
どちらの機能は、あなたがあなたの多段ビルド中にファイルシステムキャッシュのmavenのローカルを使用することができるようになります。
現時点では私はあなたのビルド環境が異なるに起因している多くの問題に直面していない限り、解決策として、あなたのオプション1を維持するために助言します。