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:因为生活显然还不够艰难。十分之九的牙医都同意:YAML 会导致生产腐烂!

“有人说过,YAML 是最好的配置形式,除了那些不时尝试过的其他形式。”——不是温斯顿·丘吉尔

不管怎样,YAML 是一个完全不同的“奥普拉”,我们没有太多时间深入研究它,所以让我们继续:我们想要简化 Dockerfiles 的创建。Dockerfiles 既繁琐,又要求我们重新指定在生产环境中运行应用程序所需完整的环境。虽然可以用相当少的行数让某些东西工作,但正如我在避免 COVID-19 病毒时学到的那样,“最少”并不等于“没有!”此外,某些东西能工作并不构成生产环境。我们可以做得更好。

Paketo 是一个基于buildpacks 项目的 Cloud Foundry 基金会项目,该项目来自CNCF(代表“代码永远不会完成”,或者可能是“通用网络代码基金会”,或者说是“云原生计算基金会”?)。网站上写道:“buildpacks 将您的应用程序源代码转换为可以在任何云上运行的镜像。Paketo Buildpacks 为应用程序提供语言运行时支持。它们利用 Cloud Native 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 tagdocker push 将该镜像推送到您选择的容器注册表(VMware HarborGoogle Container RegistryJFrog Container RegistryDockerHub 等)。

您想将其投入生产吗?这也很简单!这是 Kubernetes 的正确咒语,假设您的镜像位于 Google Container Registry,工件 ID 为 demopom.xml 中指定的版本也成为容器版本的标签。

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

希望这足以让您投入生产,甚至无需配置 Jib 或 Spotify Maven 插件,也无需编写冗长的、复杂的 shell 脚本来自行执行 docker build。当然,您可能仍然需要出于某种原因创建自己的 `Dockerfile`,因为您可能对特定层的顺序或内容有意见,如果是这样,Spring Boot 也会在这里提供支持

好了,这已经足够您入门了。访问Spring Initializr(我在互联网上最喜欢的第二个地方,仅次于生产环境)并生成一个新项目,然后将您的容器化应用程序部署到您选择的平台。

您喜欢这种一目了然的方法吗?您学到什么了吗?与往常一样,我很想听到您的意见,所以请在 Twitter (@starbuxman) 上发表您的看法!我将在本周晚些时候发布另一期《YMNNALFT》,所以一定要关注。我还有关于以下主题的文章:简单的 RPC、*Utils 对象的花园、使用 Micrometer 进行维度指标等等。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部