为什么我们不在一个dockerfile中构建jar文件[已关闭]

nnsrf1az  于 2023-01-25  发布在  Docker
关注(0)|答案(1)|浏览(111)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

8小时前关门了。
Improve this question
我有一个Spring启动应用程序。我检查了一对夫妇dockerfile的例子,为sprint-boot应用程序。没有人不建立jar文件在dockerfile,但它是可能的。有一个意想不到的事情,我错过了。
这是我的Dockerfile,工作正常

FROM maven:3-openjdk-18
COPY . .
RUN mvn clean package

FROM openjdk:19-alpine
VOLUME /tmp
COPY --from=0  target/*.jar app.jar
CMD ["java","-jar","/app.jar"]
lqfhib0f

lqfhib0f1#

Sping Boot 可执行jar的一个优点是它包含了应用程序的所有代码及其依赖项。这为您提供了一个可以部署的单一单元。当您将应用程序打包到容器中时,它就成为了这个单一部署单元,它还包含JVM和应用程序所需的任何其他内容。假定容器是一个单一部署单元,罐 Package 可以说是不再需要了。
如Sping Boot 参考文档中所述,在构建容器时解压缩可执行文件jar可以略微缩短启动时间。您可以分解jar文件,然后使用Spring Boot的JarLauncher启动分解的“jar”:

$ jar -xf myapp.jar
$ java org.springframework.boot.loader.JarLauncher

这种方法可以确保类路径的顺序与使用java -jar运行应用程序时的顺序相同。
或者,您可以手动指定类路径并直接运行应用程序的main方法:

$ jar -xf myapp.jar
$ java -cp BOOT-INF/classes:BOOT-INF/lib/* com.example.MyApplication

这将导致启动时间进一步小幅增加,代价是可能更改类路径的顺序。

相关问题