我管理著一個大型專有系統(tǒng),該系統(tǒng)在 Java 中受到了大約十幾個服務(wù)的影響。我們有一組核心的 java 庫,它們都共享),并且所有組件/應(yīng)用程序都是使用 maven 構(gòu)建的。在核心 SDK jar 之外,盡管每個應(yīng)用程序都有自己獨特的依賴項集。我無法弄清楚在 docker 內(nèi)部構(gòu)建和部署的最佳方法是什么。理想情況下,我希望整個生命周期都在 docker 中,使用多階段構(gòu)建方法。但是,我看不到如何使用大量依賴項來優(yōu)化它??雌饋砦铱梢宰鰞煞N方法。像以前一樣構(gòu)建,使用 maven 和 CI 服務(wù)器 (jenkins) 上的公共緩存,以便獲取依賴項并緩存一次,并且所有應(yīng)用程序都可以訪問。然后為每個應(yīng)用程序創(chuàng)建一個 dockerfile,將產(chǎn)品 jar 及其依賴項(或胖 jar)復(fù)制到容器中,并將其設(shè)置為執(zhí)行。這種方法的缺點是構(gòu)建本身可能在開發(fā)人員和 CI 服務(wù)器之間有所不同??赡軙褂孟?nexus 這樣的本地 Maven 緩存來避免每次都從互聯(lián)網(wǎng)上拉取 deps?但這仍然不能解決開發(fā)構(gòu)建不一定匹配 CI 構(gòu)建環(huán)境的問題。為每個項目使用多階段 dockerfile。我試過這個,它確實有效,我設(shè)法讓 maven 依賴層緩存,這樣它就不會太頻繁地獲取。不幸的是,每個應(yīng)用程序的中間構(gòu)建層達(dá)到了 1-2gb,我無法從守護(hù)程序中刪除“懸空”中間體,否則所有緩存都被吹走了。這也意味著如果 poms 中的某些內(nèi)容發(fā)生變化,則必須為每個應(yīng)用程序下載 jar 中的大量重復(fù)。(即它們都使用 junit 和 log4j 以及許多其他相似之處)有沒有辦法以最佳方式解決這個我沒有看到的問題?我發(fā)現(xiàn)的所有博客基本上都集中在上面的 2 種方法上(有些則專注于在容器中運行 maven 本身,這對我來說真的沒有解決任何問題)。如果沒有任何其他好的解決方案,我可能最終需要選擇選項 1。我已經(jīng)查看了 stackoverflow 和博客,我能找到的所有內(nèi)容似乎都假設(shè)您實際上只是在構(gòu)建一個應(yīng)用程序而不是其中的一個套件,因此不重復(fù)依賴項下載變得很重要。
1 回答

人到中年有點甜
TA貢獻(xiàn)1895條經(jīng)驗 獲得超7個贊
我認(rèn)為只要您--update-snapshots
在 Maven 構(gòu)建中設(shè)置該選項,就可以使用 .m2/repository 文件系統(tǒng)緩存。它可以更好地擴(kuò)展,因為您在每個構(gòu)建環(huán)境中只緩存每個 .jar 一次,而不是每個應(yīng)用程序一次。此外,單個依賴項的更改不會使整個緩存失效,如果您使用 docker-layer-caching,就會出現(xiàn)這種情況。
不幸的是,目前這不能與多階段構(gòu)建很好地結(jié)合,但您并不是唯一需要它的人。 此問題要求向--volume
docker build 命令添加一個選項。這一個請求允許在Dockerfile這樣的說明:RUN --mount=m2repo=/var/mvn/repo mvn install
。
這兩個功能都允許您在多階段構(gòu)建期間使用本地 Maven 文件系統(tǒng)緩存。
目前我建議保留您的選項 1 作為解決方案,除非您面臨許多由于不同的構(gòu)建環(huán)境而導(dǎo)致的問題。
添加回答
舉報
0/150
提交
取消