YMNNALFT:使用 Spring Boot Maven 插件和 Buildpacks 轻松创建 Docker 镜像

工程 | Josh Long | 2021年1月4日 | ...

欢迎收看又一期的你可能不需要另一个库#YMNNALFT)!自 2016 年以来,我花了大量时间在我的 Spring Tips 视频中阐述(或者说我一直在尝试!)Spring 生态系统中一些巨大的机遇。然而,今天我以一种不同的精神与您交流,我希望重点关注那些能做很棒的事情的、有时被隐藏起来的小型工具,它们可能会为您省去一个额外的第三方依赖及其隐含的复杂性。

您尝试过 Paketo 吗?它非常棒!它解决了当今云软件最大的痛点之一:Dockerfiles

顺带一提:最大的痛点,当然是 YAML。YAML 是导致人们离开 IT 的原因!YAML:当你想要 Python 那种对缩进敏感的诡计,同时又想要 Python 那种不存在的设计时验证,而且没有任何 Python 的好处。YAML:因为生活显然还不够艰难。10 个牙医中有 9 个同意:YAML 会导致生产环境腐烂!

"确实有人说过,YAML 是除了所有曾经尝试过的其他配置形式之外最好的配置形式。" - 温斯顿·丘吉尔(非本人)

总之,YAML 是一个全新的、完全不同的“奥普拉”(话题),我们没有太多时间深入探讨,所以我们继续:我们想简化 Dockerfile 的创建。Dockerfile 很乏味,而且需要我们重新指定运行应用程序生产环境的完整环境。虽然可以用相当少的行数实现一些功能,但正如我在躲避 COVID-19 病毒时所学到的,“最少”不等于“没有”!而且,运行正常并不代表生产环境就完善了。我们可以做得更好。

Paketo 是一个基于 buildpacks 项目(来自 CNCF,CNCF 的意思是“代码永远不会完成”,或者也许是“通用网络代码基金会”,或者“云原生计算基金会”?)的 Cloud Foundry 基金会项目。摘自官网:“Buildpacks 将你的应用程序源代码转换为可以在任何云上运行的镜像。Paketo Buildpacks 为应用程序提供语言运行时支持。它们利用云原生 Buildpacks 框架,使镜像构建变得简单、高效且安全。” 基本上:输入应用程序;输出容器。看到了吗?真棒!

Buildpacks 源自 Heroku 和 Cloud Foundry 的平台即服务产品。你给 buildpack 一个应用程序构件(比如 Java 的 .jar 文件),buildpack 会给你一个包含你的应用程序的容器。更具体地说,它会创建一个包含你的应用程序构件以及运行该应用程序构件所需的一切的合理文件系统。所以,给定一个 .jar,它可能会创建一个文件系统,其中包含一个配置了合理内存限制的 JVM,以及配置好的任何必需的 Java 代理。所有这些最终都会被转换为容器。你会震惊于几乎不进行任何配置就能将什么东西容器化!Buildpacks 之所以有效,是因为,无论我们怎么抗议,大多数应用程序都不是特殊的。对每个人来说,.jar 就是 .jar,Node.js/NPM 项目的构建对每个人来说都是一样的。Buildpacks 支持多种不同的语言和运行时(太多了,数不过来)。你可以使用 Paketo CLI 来快速容器化各种应用程序,例如:pack build .

或者,就算不是,如果你没有使用 Spring Boot 2.3 或更高版本。但是,你使用,对吧?Buildpack 支持现在已经集成到了 Spring Boot 构建插件本身。

如果你使用 Maven,你可以输入以下咒语

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=bootiful/demo

如果你使用 Gradle,你可以输入以下咒语

./gradlew bootBuildImage --imageName=bootiful/demo

稍等片刻,让它完成所有工作。它会在工作结束后输出 Docker 镜像。然后你可以使用 docker tag,然后将该镜像 docker push 到你选择的容器注册表中(例如 VMware HarborGoogle Container RegistryJFrog Container RegistryDockerHub 等)。

你想将它部署到生产环境吗?那也很简单!这是 Kubernetes 的正确咒语,假设你的镜像在 Google Container Registry 上,并且具有 demo 的 artifact ID。在 pom.xml 中指定的版本也会成为容器版本的标签。

kubectl create deployment demo --image=gcr.io/bootiful/demo

希望这些足够让你快速部署到生产环境,而无需配置 Jib 或 Spotify Maven 插件,或者编写一个冗长、复杂的 shell 脚本来执行 docker build 本身。现在,别误会我的意思。你可能仍然需要因为任何原因创建自己的 `Dockerfile`,因为你可能对特定层的顺序或内容有自己的想法,如果是这样,那么 Spring Boot 也会为你提供支持

好了,这足够让你开始使用了。前往 Spring Initializr(我第二喜欢的互联网地方,仅次于生产环境)生成一个新项目,然后将你的容器化应用程序部署到你选择的平台。

你喜欢这种“一览 Gem”的方法吗?你学到了什么吗?一如既往,我渴望听到你的反馈,所以 请在 Twitter (@starbuxman) 上畅所欲言!我将在本周晚些时候发布 YMNNALFT 的下一期,所以一定不要错过。我将介绍,除其他主题外,还包括 Easy RPC、*Utils 对象的花园、Micrometer 的维度指标,以及更多更多话题。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有