谷歌助力,快速实现 Java 应用容器化

jibDockerBuild发生Unauthorized for registry-1.docker.io/library/openjdk 项目场景: 在使用gradlew :jibDockerBuild 构建项目镜像时发生错误jibDockerBuild发生Unauthorized for registry-1.docker.io/library/openjdk 问题描述: 项目中使用了如下: @Override public void run() { bytes = mmInStream.read(buffer); mHandler.obtainMessage(READ_DA 阅读详情

 

Google 在 2018 年下旬开源了一款新的 Java 工具 Jib,可以轻松地将 Java 应用程序容器化。通过 Jib,我们不需要编写 Dockerfile 或安装 Docker,通过集成到 Maven 或 Gradle 插件,就可以立即将 Java 应用程序容器化。

 

一、什么是 Jib

Jib 是一个快速而简单的容器镜像构建工具,它作为 Maven 或 Gradle 的一部分运行,不需要编写 Dockerfile 或运行 Docker 守护进程。它从 Maven 或 Gradle 中构建我们的 Docker 镜像, 并只将发生变更的层(而不是整个应用程序)推送到注册表来节省宝贵的构建时间。现在,我们对 Docker 构建流程和 Jib 构建流程进行对比。Docker 构建流程,如下所示。

 

Jib 构建流程,则是这样的。

 

二、实战出真知

1. 构建一个简单的 Java 工程

我们编写一个简单的 Java 类。

 
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); System.out.println("http://blog.720ui.com"); } } 

紧接着,我们再创建一个 pom.xml 文件。

 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lianggzone.sample.lib</groupId> <artifactId>helloworld-samples</artifactId> <version>0.1</version> <packaging>jar</packaging> <name>helloworld-samples</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jib-maven-plugin.version>1.0.2</jib-maven-plugin.version> <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> </properties> <dependencies> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- Jib --> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>${jib-maven-plugin.version}</version> <configuration> <from> <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image> </from> <to> <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1</image> </to> <container> <jvmFlags> <jvmFlag>-Xms512m</jvmFlag> <jvmFlag>-Xdebug</jvmFlag> </jvmFlags> <mainClass>com.lianggzone.HelloWorld</mainClass> </container> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> 

由于默认访问谷歌的 gcr.io 仓库,而国内访问 gcr.io 不稳定会经常导致网络超时,所以笔者使用了国内的阿里云镜像服务,那么就不需要访问谷歌的仓库了。现在,我们执行 mvn compile jib:build 命令进行自动化构建,它会从 <from> 拉取镜像,并把生成的镜像上传到 <to> 设置的地址。这里,笔者还通过 ` 设置了一些 JVM 参数。

 
mvn compile jib:build 

此外,如果”登录失败,未授权”,需要通过 docker login 登录鉴权一下。此外,更好的做法是,你可以考虑在Maven 中放置凭据。

 
<settings> ... <servers> ... <server> <id>registry.cn-hangzhou.aliyuncs.com</id> <username>你的阿里云账号</username> <password>你的阿里云密码</password> </server> </servers> </settings> 

最后,执行完成后,我们可以在阿里云镜像仓库获取镜像。

 

大功告成,现在,我们来验证一把。我们通过 docker pull 拉取镜像,并运行。

 
docker pull registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1 docker run --name jib-helloworld -it registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-helloworld:v1 /bin/bash 

执行结果,如下所示。

 

2. 构建一个 SpringBoot 的可运行 Jar

我们来一个复杂一些的项目,构建一个 SpringBoot 的项目。关于 SpringBoot 的使用,可以阅读笔者之前的文章: http://blog.720ui.com/columns/springboot_all/ 。现在,我们首先需要搭建一个工程,并创建一个启动类。

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

同时,需要一个 Web 的接口。

 
@RestController public class WebController { @RequestMapping("/blog") public String index() { return "http://blog.720ui.com"; } } 

紧接着,我们再创建一个 pom.xml 文件。

 
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> </parent> <groupId>com.lianggzone.sample.lib</groupId> <artifactId>springboot-samples</artifactId> <version>0.1</version> <packaging>jar</packaging> <name>springboot-samples</name> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jib-maven-plugin.version>1.0.2</jib-maven-plugin.version> <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- Jib --> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>${jib-maven-plugin.version}</version> <configuration> <from> <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/oracle_java8</image> </from> <to> <image>registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1</image> </to> <container> <jvmFlags> <jvmFlag>-Xms512m</jvmFlag> <jvmFlag>-Xdebug</jvmFlag> </jvmFlags> </container> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> 

现在,我们执行 mvn compile jib:build 命令进行自动化构建。执行完成后,我们可以在阿里云镜像仓库获取镜像。

 

现在,我们再来验证一把。我们通过 docker pull 拉取镜像,并运行。

 
docker pull registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1 docker run -p 8080:8080 --name jib-springboot -it registry.cn-hangzhou.aliyuncs.com/lianggzone/jib-springboot:v1 /bin/bash 

执行结果,如下所示。

 

现在,我们访问 http://localhost:8080/blog ,我们可以正常调用 API 接口了。

 

3. 构建一个 WAR 工程

Jib 还支持 WAR 项目。如果 Maven 项目使用 war-packaging 类型,Jib 将默认使用 distroless Jetty 作为基础镜像来部署项目。要使用不同的基础镜像,我们可以自定义 <container><appRoot> , <container> <entrypoint> 和 <container> <args> 。以下是使用 Tomcat 镜像的案例。

 
<configuration> <from> <image>tomcat:8.5-jre8-alpine</image> </from> <container> <appRoot>/usr/local/tomcat/webapps/ROOT</appRoot> </container> </configuration>

喜欢的点点关注,点点赞。

对Java技术,架构技术感兴趣的同学,欢迎加QQ群585550789,一起学习,相互讨论。

群内已经有小伙伴将知识体系整理好(源码,笔记,PPT,学习视频),欢迎加群领取。

 

ADS122U04IPWR+PIC18F8722工业温度采集系统设计 温度采集是工业测控的基础环节,其核心在于高精度ADC与可靠MCU的协同——既要抑制热电偶微伏级信号的本底噪声,又要保障宽温、强干扰环境下数据采集的确定性与时序稳定性。ADS122U04IPWR凭借24位ΔΣ架构、集成低温漂基准与PGA,显著提升信噪比和冷端补偿精度;PIC18F8722则以硬件PWM恒流源、自动地址识别USART等特性,实现低纹波激励与高效RS485多节点通信。该组合在HVAC、制药灭菌、窑炉监控等场景中验证了-40℃~85℃长期运行的鲁棒性,适用于需复用老平台、严控BOM成本且拒绝复杂软件 阅读详情

相关推荐

1、云、大数据与Spring Boot:构建企业级应用的技术指南

本文深入探讨了云技术、大数据处理及Spring Boot框架在企业级应用开发中的应用。从云与大数据的现状与挑战出发,介绍了数据科学、云特性与基础设施,以及构建企业级应用所需的关键工具与技术。通过对比传统Spring框架与Spring Boot,展示了Spring Boot在简化开发、支持云原生方面的优势,并结合示例演示了如何使用Spring Boot创建高效、可扩展的应用。文章适合希望了解现代企业应用开发技术的开发者和架构师。

peach的博客 131

Java | Guava EventBus 使用 发布/订阅模式

JAVA | Guava EventBus 使用 发布/订阅模式 EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。 观察者模式在我们日常开发中使用非常广泛,例如在订单系统中,订单状态或者物流信息的变更会向用户发送APP推送、短信、通知卖家、买家等等;审批系统中,审批单的流程流转会通知发起审批用户、审批的领导等等。 Observer模式也是 JDK 中自带就支持的,其在 1.0 版本就已经存在 Observer

双鬼带单 1209

Eclipse Google Cloud 插件

Google 云 Eclipse 插件

Google开源其Java容器化工具Jib,简化镜像构建全流程

作者|Appu Goundan、Qingyang Chen编辑|无明容器的出现让 Java开发人员比以往任何时候都更接近“编写一次,到处运行”的工作流程,但要对 Java应用程序进行容器化并非易事:你必须编写 Dockerfile,以 root身份运行 Docker守护进程,等待构建完成,最后将镜像推送到远程注册中心。但并非所有的 Java开发人员都是容器专家,像以前那样只需要构建一个 JAR包的...

varyall的专栏 3383

在Jetson Orin (Arm64)上从Ubuntu22.04回退至20.04的完整指南及ROS-noetic适配方案

本文提供了在Jetson Orin (Arm64)设备上将Ubuntu 22.04系统回退至20.04 LTS版本的完整操作指南。针对机器人开发中ROS-noetic对Ubuntu20.04的官方最佳支持,详细阐述了从关键备份、软件源与APT优先级配置、系统降级执行到后续问题排查的全过程,并附带了在Arm64架构上成功安装和验证ROS-noetic的适配方案,旨在为开发者构建稳定可靠的机器人开发环境。

flower的专栏 580

tiny4412用 usb 连接计算机显示sec s5pc210 test b/d 解决方法

当我用USB线连接tiny4412的microUSB端口的时候,出现了驱动没有正常安装,显示“sec s5pc210 test b/d” 出现这种问题的原因有: 1、没有安装到正确的USB驱动; 2、SD卡没有插好 我出现问题的原因属于第二种,插入SD卡后,上电后,LCD屏亮了,但没有任何显示   解决方法是:     更换一张SD卡,重新插入开发板卡槽,上电开

karaskass的博客 3233

稀疏注意力机制:DeepSeek 如何用算法创新打破大模型成本瓶颈

在自然语言处理和代码生成领域,Transformer 架构的注意力机制是核心组件,但其计算复杂度与序列长度的平方成正比,导致处理长上下文时算力与显存需求急剧上升,形成了高性能、长上下文与低成本之间的“不可能三角”。稀疏注意力机制通过算法创新,将计算模式从“全员大会”转变为高效的“小组讨论”,仅计算局部窗口和关键全局token之间的关联,从而将复杂度近似降至线性。这项技术价值在于,它从架构层面重塑了计算范式,使得在保持模型关键能力的前提下,大幅降低了训练和推理的资源消耗。其应用场景广泛,尤其适合需要处理长代码

weixin_34245082的博客 414

施耐德EcoStruxure平台深度体验:IEC 61499在智慧物流中心的真实应用案例解析

本文深度解析施耐德EcoStruxure平台在智慧物流中心的应用,重点探讨IEC 61499标准如何通过分布式控制和功能块技术重构自动化逻辑。通过上海某物流中心的真实案例,展示了该平台在提升系统弹性、降低停机成本方面的显著成效,为工业自动化转型提供实践参考。

weixin_30576827的博客 66

java 容器_谷歌助力,快速实现 Java 应用容器化

Google 在 2018 年下旬开源了一款新的 Java 工具 Jib,可以轻松地将 Java 应用程序容器化。通过 Jib,我们不需要编写 Dockerfile 或安装 Docker,通过集成到 Maven 或 Gradle 插件,就可以立即将 Java 应用程序容器化。一、什么是 JibJib 是一个快速而简单的容器镜像构建工具,它作为 Maven 或 Gradle 的一部分运行,不需要编写...

weixin_39840235的博客 276

虚拟零售智能客服架构设计:如何用大模型实现多轮对话与精准推荐?

想象一下,当你在一个电商平台购物时,遇到了一个能像你的专属导购一样,不仅能听懂你模糊的需求(“我想买一件适合夏天去海边玩,又能兼顾日常通勤的裙子”),还能记得你之前提到的尺码偏好和预算,甚至在你犹豫时,主动推荐几款符合你风格且正好有促销活动的商品——这不再是科幻电影中的场景,而是基于大语言模型(LLM)技术的新一代虚拟零售智能客服能够提供的体验。这一层是我们架构设计的重点,会在后续章节详细展开。如基于CRF、RNN的模型,或基于规则的状态更新,通常需要大量标注的对话状态数据,且对新领域、新槽位的适应性差。

Java大师兄的博客 1590

手把手教你用STM32实现SPWM逆变器控制(附完整代码)

本文详细介绍了如何使用STM32微控制器实现SPWM逆变器控制,包括硬件设计、PWM生成配置、正弦表生成与DMA传输,以及闭环控制与性能优化。通过完整的代码示例和实测数据,帮助开发者快速掌握SPWM技术,应用于新能源和电力电子领域。

weixin_29296241的博客 319

‌谷歌云代理商:什么是‌谷歌云计算?

是谷歌提供的云计算服务,旨在帮助企业、开发者和组织通过互联网访问谷歌的全球基础设施和先进技术。谷歌云计算提供了广泛的计算、存储、数据库、人工智能(AI)、机器学习(ML)、网络和安全服务,帮助用户构建、部署和管理应用程序。

feixiangdeniao1的博客 1590

YOLOv11在视频流中的时序建模改进-(加入ConvLSTM或Transformer捕捉帧间关联)

本文提出了一种结合ConvLSTM和Transformer的改进YOLOv11算法,用于增强视频目标检测的时序建模能力。针对视频检测中运动模糊、遮挡等挑战,研究分析了ConvLSTM的局部时空特征建模和Transformer的全局注意力机制之间的互补性。通过数学公式详细阐述了ConvLSTM的门控机制和Transformer的自注意力计算原理,并提出分层融合策略:底层使用ConvLSTM处理高分辨率特征捕捉局部运动,高层应用Transformer建立全局时空关联。改进方案在YOLOv11架构中插入时序增强模

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 680

要闻君说:谷歌云重磅发布两大技术平台;以后可以打飞滴了?SAP重组动荡;微软宣布 Azure Functions 支持 Java...

关注并标星星优快云云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了...

优快云业界要闻 510

Chrome下载B站视频字幕的插件

本文主要介绍了Chrome下载B站视频字幕的插件,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

初探802.11协议(0)——PCF/DCF与CSMA/CA机制

IEEE802.11 CSMA/CA机制与DCF机制

FanFF的博客 4507

全球各大科技公司竟然都在做这件事情!

全球四千多个企业,包括谷歌,苹果,Netflix,甲骨文,腾讯,华为,京东,滴滴出行,小米,去哪儿,招商银行等等,都在使用 JFrog Artifactory 作为企业级持续交付平台,实现快速发布。JFrog Artifactory 开源版已经有10万+的企业用户量。 ​ JFrog Artifactory 是风靡全球的一站式 DevOps 平台,它支持所有语言(Maven,Docker,NPM ...

cheke7682的博客 201

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

国际版JAVA同城外卖跑腿团购到店多合一APP系统源码:全场景本地生活可商用

本文介绍了一套基于JAVA开发的国际版同城多合一服务系统,整合外卖、跑腿、团购和到店服务。系统采用前后端分离架构,支持多语言切换、跨境支付和时区适配,满足国际市场需求。核心优势包括:四业务深度融合、企业级JAVA架构保障稳定性、全流程闭环管理、多元变现模式。系统适用于海外华人社区、国际商圈等场景,为创业者提供一站式本地生活解决方案。通过多端协同和智能调度,实现用户、商家、跑腿员和管理员的高效联动,助力平台快速实现全球化部署和商业化运营。

m0_73514975的博客 317

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

云原生概念你了解多少

CNCF-云原生计算基金会,2015年由谷歌牵头成立,充分利用云的分布式和弹性特点,Cloud Native云原生应用的三大特征。容器化封装、动态管理:通过集中式的编排调度系统来动态的管理和调度。面向微服务:明确服务间的依赖,互相解耦。云原生以容器、微服务、DevOps等技术为基础为代表的敏捷基础架构组成,用于帮助企业快速、持续、可靠、规模化的交付业务软件,云原生需要考虑是从开发-测试-运维一体化的需求。

itxiaoshen博客 433

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

收藏!Java程序员转AI大模型:从入门到进阶的完整指南

AI大模型不是“替代程序员”,而是“赋能程序员”,Java程序员转型大模型,不是“放弃过去”,而是“升级未来”。你不需要成为算法专家,只需做好“Java基础+AI工具+实战项目”的组合,就能在新赛道中脱颖而出。与其在Java内卷中焦虑,不如花1-2个月打好AI基础,用一个实战项目开启转型之路。

python12345_的博客 709
上一篇: 什么是JPA?Java Persistence API简介
下一篇: 学会这招,你离黑客又进了一步?
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值