百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

3种方法创建没有 Docker 文件的 Spring 引导 Docker 镜像

bigegpt 2024-09-03 11:05 3 浏览

了解如何以3种方式创建没有 Docker 文件的 SpringBootDocker 映像

每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?3分钟?学习?何乐而不为?,希望?大家?点赞?,评论,加?关注?,你的?支持?是我?最大?的?动力?。



在本文中,我们将研究为 Spring 启动应用程序创建 docker 映像的一些方法。

随着技术的发展,服务于最终用户请求的应用程序的部署方式发生了变化。传统上,您需要一台机器来部署应用程序,并决定机器的配置以保持应用程序运行。

集装箱的引入,即将整个软件堆栈打包成一个单一的实体并将其发送,解决了开发人员世界中最大的问题之一。“它在我的机器上工作”:)

因此,今天我们将研究三种机制来构建 Spring 引导应用程序的 docker 映像。

  1. Spring Boot build 插件
  2. Fabric8 Maven 插件
  3. JIB Maven 插件

创建应用程序

让我们开始 https://start.spring.io ,创建一个只有 spring-web 依赖关系的应用程序。

让我们添加一个简单的控制器来接受一些请求。

Java

@RestController
@SpringBootApplication
public class ServiceDockerImageBuildApplication {

   public static void main(String[] args) {
      SpringApplication.run(ServiceDockerImageBuildApplication.class, args);
   }

   @GetMapping("/")
   public ResponseEntity get(){
      return ResponseEntity.ok("All Ok");

当我们运行这个并打开“ http://localhost:8080”时,我们得到一个响应“一切正常”

通过这个,让我们使用开箱即用的构建插件来构建我们的 docker 映像。

使用 Spring 引导构建插件构建 Docker 映像

SpringBoot 的构建插件提供了一种使用 BuildPacks 概念创建 docker 映像的方法。BuildPacks 提供了一种定义如何构建应用程序的方法。它检测应用程序的类型并构建它,以便您可以在特定的平台上运行或独立于它。

现在,Spring Boot 的构建插件使用了一个 BuildPack 构建器映像,该映像将自动检测到它是一个 Spring 启动应用程序,并为您构建相关映像。

您唯一需要做的事情是使用 maven 在您的 Spring 启动应用程序上调用映像构建目标。

Shell

mvn spring-boot:build-image

这将从 BuildPacks 中提取基生成器映像,以检测应用程序的类型并为应用程序选择生成包。然后使用选定的构建包并构建最终映像。

下面的日志显示了构建应用程序所需的构建包。

Shell

===> DETECTING
[INFO]     [creator]     6 of 24 buildpacks participating
[INFO]     [creator]     paketo-buildpacks/ca-certificates   3.2.4
[INFO]     [creator]     paketo-buildpacks/bellsoft-liberica 9.3.7
[INFO]     [creator]     paketo-buildpacks/syft              1.12.0
[INFO]     [creator]     paketo-buildpacks/executable-jar    6.2.4
[INFO]     [creator]     paketo-buildpacks/dist-zip          5.2.4
[INFO]     [creator]     paketo-buildpacks/spring-boot       5.12.0
...
...
[INFO] Successfully built image 'docker.io/library/service-docker-image-build:0.0.1-SNAPSHOT'

您总是可以使用如下所示的参数指定最终镜像的名称

Shell

mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=my-spring-boot-image

或者您可以在配置中指定它,如下所示

XML

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <configuration>
      <imageName>my-spring-boot-image</imageName>
   </configuration>
</plugin>


现在,我看到你可以在这里进行几个层次的定制。如果您想真正自定义映像的构建过程,则必须创建自己的构建器映像来定义构建过程。

让我们看看构建镜像的另一种方法。

使用 FABRIC8 Maven 插件构建 Docker 镜像

Fabric8是一个流行的集装箱化应用程序接口提供商。他们有客户端 API 来与 Kubernetes 集群通信,今天我们将使用他们的 maven 插件来构建 docker 映像。

XML

<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.40.1</version>
<configuration>
   <images>
      <image>
         <name>${project.name}:${project.version}</name>
         <build>
            <from>openjdk:17</from>
            <assembly>
               <name>build</name>
               <descriptorRef>artifact</descriptorRef>
            </assembly>
            <ports>
               <port>8080</port>
            </ports>
            <cmd>java -jar build/${project.name}-${project.version}.jar</cmd>
         </build>
      </image>
   </images>
</configuration>
   <executions>
   <execution>
      <id>build-image</id>
      <phase>verify</phase>
      <goals>
         <goal>build</goal>
      </goals>
   </execution>
   </executions>
</plugin>

配置部分非常简单,让我们看看 < build > 部分中的一些重要内容。


在这里,我们使用 < from > 标记指定基本镜像,然后在 < Assembly > 部分指定镜像的组装方式。

在 Assembly 部分,我们使用一个值工件指定 < description torRef > ,以表明我们只想复制构建的工件,而 < name > 标记指定它将被复制到目标映像中的哪个位置。DesciptorRef 有各种各样的选项,比如,如果您想将依赖项与工件一起复制,或者只复制依赖项,等等,您可以在这里找到它。因为我们建立了一个单一的脂肪罐,我们可以只复制工件。

最后,我们指定 < cmd > 来运行复制的 jar 文件。

运行 maven build 命令后,将生成映像。

我检查了镜像层,我看到工件被复制为最后一层,如下所示。

通过在组装标记中指定要创建的层以及需要在这些层中复制的内容,始终可以创建分层的 Docker 映像。您可以在此链接找到更多的自定义选项。

我们现在可以简单地使用 docker run-p 8080:8080 service-docker-image-build: 0.0.1-SNAPSHOT 运行 docker 文件

使用 Google 的 JIB 插件构建 Docker 镜像

让我们看看 Google 的 JIB 插件。它是 Google 提供和维护的工具之一,提供了相当详细的定制级别。

XML

<build>
   <plugins>
      <plugin>
         <groupId>com.google.cloud.tools</groupId>
         <artifactId>jib-maven-plugin</artifactId>
         <version>3.2.1</version>
         <configuration>
            <from>
               <image>openjdk:17</image>
            </from>
            <to>
               <image>jib-build-${project.name}:${project.version}</image>
            </to>
         </configuration>
         <executions>
            <execution>
               <phase>verify</phase>
               <goals>
                  <goal>dockerBuild</goal>
               </goals>
            </execution>
         </executions>
      </plugin>
   </plugins>
</build>

在这里,我们在 < from > 标记中指定我们想要的基本镜像,在 < to > 标记中指定我们想要的最终镜像名称。

现在,我已经在 < execute > 部分中使用了 dockerBuild 目标,以便将 docker 映像构建到我的本地 docker 守护进程中。如果使用构建目标,JIB 插件将构建 docker 映像,并将其推送到相应的存储库。它支持所有主要的存储库,如 docker.io、 AWS ECR、 Google GCR、 Azure ACR 等。为此,可以设置身份验证机制来推送映像。你可以在这里读到。

让我们看看创建的镜像的层次。

如果你在上面的图片中看到,图层创建如下

  • 第1层: 包含所有依赖项
  • 第2层: 包含应用程序资源
  • 第3层: 包含应用程序类
  • 第4层: 包含jib-classpath-file 包含类路径信息和jib-main-class-file. 包含将要执行的完全限定主类的名称

您总是可以通过查找此链接中的选项来自定义构建镜像的方式

结论

今天我们看到了如何构建 docker 映像,而不需要手动编写 docker 文件。我们只需要在你的 maven 构建配置文件中包含一个插件,构建映像并将其推送到存储库中。

我个人喜欢的一个是 jib 插件,因为它的定制级别和 Docker 镜像层可以开箱即用。

你可以在这里找到我的 GitHub 回购的完整代码。

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...