使用SpringBoot框架如何实现创建一个码头工人镜像?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强> 1。传统码头工人构建强>
使用弹簧引导构建码头工人镜像的传统方法是使用Dockerfile。下面是一个简单的例子:
然后我们可以使用码头工人建造命令来创建码头工人映像。这对大多数应用程序都很好,但也有一些缺点。
首先,我们使用的是弹簧引导创建的脂肪jar。这会影响启动时间,尤其是在集装箱环境中。我们可以通过添加jar文件的分解内容来节省启动时间。
其次,码头工人镜像是分层构建的.Spring引导脂肪jar的特性使得所有的应用程序代码和第三方库都放在一个层中。这意味着即使只有一行代码更改,也必须重新构建整个层。
通过在构建之前分解罐,应用程序代码和第三方库各自获得自己的层。这样,我们便可以利用码头工人的缓存机制。现在,当某一行代码被更改时,只需要重新构建相应的层。
考虑到这一点,让我们看看春天引导如何改进创建码头工人镜像的过程。
BuildPacks是一种提供框架和应用程序依赖性的工具。
例如,给定一个弹簧引导脂肪罐子,一个buildpack将为我们提供Java运行时。这使我们可以跳过Dockerfile并自动获得一个合理的码头工人镜像。
春季启动包括对bulidpacks的Maven和Gradle支持,例如,使用Maven构建时,我们将运行以下命令:
。/mvnw spring-boot:构建过程我们观察下一些相关的输出,看看发生了什么:
[信息]构建jar:目标/demo-0.0.1-SNAPSHOT.jar … [信息]建筑形象& # 39;docker.io/图书馆/演示:0.0.1-SNAPSHOT& # 39; … [信息]比;拉builder图像& # 39;gcr.io/paketo-buildpacks/建筑商:基础平台- api - 0.3 & # 39;100% … [信息]【造物主】===比;检测 [信息]【造物主】5 15 buildpacks参与 [信息]【造物主】paketo-buildpacks/bellsoft-liberica 2.8.1发布 [信息]【造物主】paketo-buildpacks/可执行jar 1.2.8 [信息]【造物主】paketo-buildpacks/apache tomcat 1.3.1 [信息]【造物主】paketo-buildpacks/dist-zip 1.3.6 [信息]【造物主】paketo-buildpacks/spring-boot 1.9.1 … [信息]成功地建立图像& # 39;docker.io/图书馆/演示:0.0.1-SNAPSHOT& # 39; [信息]总时间:44.796 s第一行显示我们构建了标准的脂肪jar,与其他典型的maven包一样。
下一行开始码头工人映像构建。然后,看到这个建造拉取了packeto构建器。
packeto是基于云原生bulidpacks的实现。它负责分析我们的项目并确定所需的框架和库。在我们的例子中,它确定我们有一个弹簧启动项目并添加所需的构建包。
最后,我们看到生成的码头工人映像和总构建时间。注意,在第一次构建时,花了相当多的时间下载构建包并创建不同的层。
buildpacks的一大特点是码头工人映像是多层的,因此,如果我们只更改应用程序代码,后续构建将更快:
… [信息](创造者)复用层& # 39;paketo-buildpacks/可执行jar: - path # 39; [信息](创造者)复用层& # 39;paketo-buildpacks/spring-boot: web-application-type& # 39; … [信息]成功地建立图像& # 39;docker.io/图书馆/演示:0.0.1-SNAPSHOT& # 39; … [信息]总时间:10.591 s
在某些情况下,我们可能不喜欢使用bulidpacks——也许我们的基础架构已经绑定到另一个工具上,或者我们已经有了我们想要重新使用的自定义Dockerfiles。
基于这些原因,弹簧引导还支持使用分层jar构建码头工人映像。为了了解它的工作原理,让我们看看一个典型的弹簧引导脂肪jar布局:
org/八?平原;” springframework/启动/加载器/? BOOT-INF/类/? lib/?/pre>脂肪jar由3个主要区域组成:
- <李>启动弹簧应用程序所需的引导类李> <>李应用程序代码李> <李>第三方库李>
使用分层jar,结构看起来很相似,但是我们得到了一个新的层。idx将脂肪jar中的每个目录映射到一个层的文件:
使用SpringBoot框架如何实现创建一个码头工人镜像