簡體   English   中英

Java docker文件。 生成並測試還是只運行jar文件?

[英]Java docker file. Build and test or just run jar file?

我在CI管道中正在考慮這一點,我應該首先構建和測試我的應用,結果應該是docker映像。

我想知道是否更常見的是使用構建環境在構建服務器上進行構建然后運行測試。 也許為此使用構建腳本。 最后,只需將jar文件添加到使用COPY生成的Docker容器中,然后使用Entrypoint java -jar .jar。 因此,請保持Dockerfile很小,並在容器外部進行測試和構建。

有點像這樣:

FROM openjdk:8-jre-alpine
CMD java ${JAVA_OPTS} -jar *.jar
COPY build/libs/*.jar .

或者,如果我應該將所有源代碼添加到容器中,請構建它,然后在容器中運行測試,然后讓Entrypoint(如前所述)運行所生成的jar文件? 那么將所有內容都保留在Dockerfile中嗎? 也許還要進行一些清理,刪除源代碼

我猜這不一定是Java,同樣的問題適用於所有語言

您可以使用JDK和為此目的所需的所有工具在所謂的構建docker映像中構建和測試應用程序。 完成並感到高興后,您將jar / war作為工件提取到CI / CD管道中,然后,當您考慮將其投入生產時,就可以構建生產docker映像並將其放入內部,其中只有JRE / Tomcat(只需要生產用的任何東西)-無需開發工具,而無需編譯工具-盡可能小巧,時尚。

因此,每個應用程序基本上總是至少有2張圖像,其中一張用於構建,另一張用於在生產環境中運行。 混合使用是非常不好的做法,遲早會導致問題。

在主機上構建甚至更糟,因為您不以這種方式使用干凈的環境,這或多或少是docker的主要優勢之一-而且您無法在本地輕松地復制構建。

優化容器構建

過去,為了創建一個不包含源代碼(以及用於創建二進制文件的軟件)的Docker映像,一個被迫運行Docker兩次。例如,請參閱

現在,Docker支持新的多階段構建功能:

這使Docker可以使用包含構建工具的映像來構建容器,但僅輸出具有運行時依賴項的映像。 以下示例演示了此概念,請注意如何從第一個構建階段的目標目錄復制jar

FROM maven:3.3-jdk-8-onbuild 

FROM java:8
COPY --from=0 /usr/src/app/target/demo-1.0-SNAPSHOT.jar /opt/demo.jar
CMD ["java","-jar","/opt/demo.jar"]

生成的圖像不包含Maven,僅包含Java和內置的jar。

測試中

假設我們不是在談論單元測試(可以在本地運行),那么集成測試需要首先部署代碼。 在這種情況下,答案很大程度上取決於您如何部署容器化Java應用程序。

例如,如果您使用的是Kubernetes或Openshift,則一種選擇是使用Fabric8插件在Maven中運行測試階段之前部署代碼。

為了解決這個問題,我借鑒了計算機科學的SoC(關注分離)設計原理,並決定采用兩種docker image方法:一種用於構建/測試應用程序,另一種用於運行應用程序。 將流程分開的另一個好處是減少了意外行為的機會,這將簡化維護和回歸測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM