繁体   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