【橘子容器】如何构建一个docker镜像
你肯定打过docker镜像是吧,作为一个开发这很正常,那么你用的什么打包方式呢,这里我们来梳理几种常用的docker镜像构建方式。
ps:这里不是太讲原理,更多的是一种科普和操作。因为讲原理的东西网上已经够多了。
一、Dockerfile
dockerfile的打包方式很常见了,我们需要构建一个文件,名字必须就叫Dockerfile,没有后缀名。
我们举个例子,我现在有一个springboot项目,当我们构建出一个jar包的时候,我们就可以基于这个jar包来构建一个docker image。此时我们需要编写一个Dockerfile。比如这样
FROM openjdk:17LABEL "org.opencontainers.image.authors"="areyouok"COPY target/app-0.0.1-SNAPSHOT.jar accounts-0.0.1-SNAPSHOT.jarENTRYPOINT ["java", "-jar", "app-0.0.1-SNAPSHOT.jar"]
我们在这个dockerfile中描述了我们要执行的一组docker指令,然后我们使用docker build来构建镜像,此时就会基于这个文件来构建出我们需要的镜像。
但是这种模式存在一个问题,我们需要知道docker的一些指令,不然你无法构建出合理的镜像。
那么问题来了,我作为一个开发,要学的东西本身就一大堆了。你还要我去掌握这种相对属于运维的知识?我为啥要会docker呢,真就纯当牛马是吧。所以这种模式不好,他无法屏蔽我们对于docker知识的理解,而且我这个文件还比较简单,如果你是大型项目,dockerfile会很复杂,可能要考虑构建的体积,资源的占用以及构建的速度等等。这更加增大了我们的心智成本。至于那个什么docker compose也差不多一样。所以我们需要一种屏蔽底层命令的方式来帮助我们构建镜像。于是在这种需求下,业界产生两种新的构建模式,BuildPacks和Goole libs。下面我们就来看看这两种模式如何操作。
二、BuildPacks
其原理介绍可以参考BuildPacks介绍
我们只需要知道,这种模式不需要你编写什么构建文件,他会分析你的源代码,然后分析编译产生最终的docker image。而且他的构建是完全遵守docker的规范和协议的,构建的大小也是合理的。这个你不需要担心。对于开发来说实在是解放双手的不二选择。他的官网地址是BuildPacks官方地址
下面我们以一个springboot服务来演示一下这东西如何使用。
首先我们要明白BuildPacks是一个生态,在这个生态内有一个很方便的工具来使用,帮助我们构建镜像。那就是paketo
你能看到他支持多种应用的构建,其中自然包括java
1、pom文件
首先你要确认你的pom文件是可以打包为jar的,当你有了这个配置哪你就要保证有maven对应的插件。也就是如下配置。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>......<packaging>jar</packaging>......<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
这样我们就可以确保我们可以基于maven构建springboot对应的jar包。并且buildpacks也是基于这个来构建镜像的。当我们有了这个之后,我们还需要在配置中为镜像构建提供一些信息,比如名称之类的,好的,让我们来修改一下我们的pom配置。
......<artifactId>loans</artifactId><version>0.0.1-SNAPSHOT</version><name>loans</name><packaging>jar</packaging>
......<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--这里做了修改--><image><name>levi/${project.artifactId}:s4</name><!--你的镜像名称和版本号,你可以取一个你能标识的,我这里用的就是服务的坐标名称,版本号s4--></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
ok,至此我们的配置就简单的改完了,当然你还可以配置一些其他的诸如作者信息等等。你可以看到非常简单,他会分析你的pom文件中的结构信息包括jdk版本之类的构建对应的镜像结构。
2、mvn构建
此时让我们借助idea的maven工具并且使用mvn spring-boot:build-image来构建镜像,他会在后台为我们通过buildpacks来构建镜像,其实就是maven其实集成了这个功能而已。或者你也可以直接在dos窗口用mvn命令,我因为没配maven环境变量所以懒得弄了。当然你要先启动你的docker服务。
第一次构建可能会稍微耗时一点,可以略微等一等,但是他是增量的,第二次就快了。
最终我们可以看到构建成功了.
此时我们就可以使用命令看看我们是不是有这个镜像了。
没有问题,名称和版本都是我们指定的。接下来你就可以使用这个镜像了。
三、google jib
这个工具是谷歌公司搞得,你可以在github上看到他google jib
你可以在介绍中看到,他其实也是可以构建多语言应用的镜像,自然也是包括java的。所以我们完全可以使用。
而且支持maven插件,我们可以点进去链接,然后按照教程使用即可。
1、pom文件
按照教程我们要在我们的pom文件中添加一个插件。
<plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.3.2</version><configuration><to><image>myimage</image></to></configuration>
</plugin>
所以我们要修改一下我们的pom文件。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">......<artifactId>cards</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging>......<build><plugins><plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>3.3.2</version><configuration><to><image>levi/${project.artifactId}:s4</image><!--这里还是名字,版本--></to></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
此时刷新你的pom,你会看到idea就为你引入了这个插件。
2、mvn构建
此时你就可以使用这个来构建了,当然你依然可以使用mvn命令(mvn compile jib:dockerBuild)如果你配置了环境变量的话。
所以我们可以直接在idea插件中运行即可。
ok,我们可以看到最后是构建成功的。
我们再次查看一下我们的镜像库。
没有任何问题。而且前面的几种方式不管是dockerfile还是buildpacks你至少本地得有个docker服务,也就是docker环境。但是google jib甚至不需要你装docker服务,就是这么简单。但是你的运行环境还是要有的,毕竟你最终是要启动容器的。他只是在构建的时候不需要docker环境。
但是这对于我们实际是很有帮助的,比如你在公司配置jeckens这种自动构建,你完全可以不用docker了,只需要配置构建即可。
当然他还有很多配置,你可以参考文档。
四、总结
至此我们就介绍了常用的几种构建模式,我们看到其实各有利弊吧。看你喜欢哪一种了,只是后面两种不需要你掌握太多docker知识,更加专注于业务开发。
在buildpacks的官方文档下面有一个对比的表格,我们可以看到各类构建的优劣。
构建模式大比武
当然,很多时候这种带点吹自己贬别人,你如果不相信他的说法,可以自己测试一下,相信结果。
相关文章:

【橘子容器】如何构建一个docker镜像
你肯定打过docker镜像是吧,作为一个开发这很正常,那么你用的什么打包方式呢,这里我们来梳理几种常用的docker镜像构建方式。 ps:这里不是太讲原理,更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…...

EFAK kafka可视化管理工具部署使用
简介:EFAK是开源的可视化和管理软件。它允许您查询、可视化、提醒和探索您的指标,无论它们存储在何处。简单来说,它为您提供了将 Kafka 集群数据转换为漂亮的图形和可视化效果的工具。 环境:①操作系统:CentOS7.6&…...
Spring Boot 工程分层实战(五个分层维度)
1、分层思想 计算机领域有一句话:计算机中任何问题都可通过增加一个虚拟层解决。这句体现了分层思想重要性,分层思想同样适用于Java工程架构。 分层优点是每层只专注本层工作,可以类比设计模式单一职责原则,或者经济学比较优势原…...

vscode IntelliSense Configurations
IntelliSense 是一个强大的代码补全和代码分析功能,它可以帮助开发者提高编程效率。图中显示的是 VSCode 的 IntelliSense 配置界面,具体配置如下: Compiler path(编译器路径): 这里指定了用于构建项目的编译器的完整路…...

hbase读写操作后hdfs内存占用太大的问题
hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…...

C++----入门篇
引言 C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助,本章节主要目标: 1. 补充C语言语法的不足,以及C是如何对C语言…...

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期
知识要点:变量的作用域和生存期 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组,内放 10 个学生成绩,写一个函数,求出平均分、最高分和最低分。 任务要求用一个函数来完…...
用 Sass 模块化系统取代全局导入,消除 1.80.0 引入的 @import 弃用警告
目录 前言 问题 import 的缺陷 命名冲突 重复导入 模块系统 use 规则 forward 规则 实际修改 前言 最初,Sass 使用 import 规则通过单个全局命名空间加载其他文件,所有内置函数也可全局使用。由于模块系统(use 和 forward 规则&…...

安卓低功耗蓝牙BLE官方开发例程(JAVA)翻译注释版
官方原文链接 https://developer.android.com/develop/connectivity/bluetooth/ble/ble-overview?hlzh-cn 目录 低功耗蓝牙 基础知识 关键术语和概念 角色和职责 查找 BLE 设备 连接到 GATT 服务器 设置绑定服务 设置 BluetoothAdapter 连接到设备 声明 GATT 回…...
搭建fastapi项目
环境准备 # 创建项目目录 mkdir my_fastapi_project cd my_fastapi_project# 创建和激活虚拟环境 python -m venv venv .\venv\Scripts\activate安装必要的包 pip install fastapi uvicorn python-dotenv创建项目基本结构 my_fastapi_project/ │ .env # …...

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)
目录 一、Maven项目模块化? (1)基本介绍。 (2)汽车模块化生产再聚合组装。 (3)Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…...
华为云云原生中间件DCS DMS 通过中国信通院与全球IPv6测试中心双重能力检测
近日,中国信息通信研究院(以下简称“中国信通院”)与全球IPv6测试中心相继宣布,华为云的分布式缓存服务(Distributed Cache Service,简称DCS)和分布式消息服务(Distributed Message …...

PostgreSQL中事件触发器Event Trigger
在PostgreSQL中,事件触发器(Event Trigger)是一种特殊的触发器类型,它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同,事件触发器并不与特定的表或视图相关联,而是与数据库级别的全…...
uni.request流式(Stream)请求,实现打印机效果
最近使用扣子 - 开发指南 (coze.cn)和智谱AI开放平台开发小程序AI导诊和用药对话指南。 开发的过程中也是走了不少坑,下面就来聊聊走了哪些坑。 坑1 :coze试了v2和v3的接口,两个接口请求还是有点差别的,v2拿到了botId和accessToken可以直接请求不需要做任何处理,v3还需要…...
canvas保存图片
需求:上面有几个按钮,其中有一个切换是图片 用v-if会导致图片加载慢 实现方法: 一进来就加载,通过监听元素显示,用于控制canvas的宽高,从而达到隐藏的效果 组件dowolad.vue <template><view …...
DNS到底有什么用?
举个例子,对于我们来说访问的域名是www.baidu.com,但是实际在计算机并不认识这个域名,计算机是需要通过IP地址去访问这个网站,所以呢?这个时候就需要一个dns解析器,来把这串域名转换为IP地址给计算机去访问…...

什么是CRM系统?CRM系统的功能、操作流程、生命周期
CRM系统作为企业管理和维护客户关系的重要工具,在商业活动中扮演着越来越重要的角色。今天,就让我们一起揭开它的神秘面纱,看看这个“幕后英雄”到底是怎么工作的。 什么是CRM系统? 首先,我们要了解什么是CRM。简单来…...

美畅物联丨JS播放器录像功能:从技术到应用的全面解析
畅联云平台的JS播放器是一款功能十分强大的视频汇聚平台播放工具,它已经具备众多实用功能,像实时播放、历史录像回放、云台控制、倍速播放、录像记录、音频播放、画面放大、全屏展示、截图捕捉等等。这些功能构建起了一个高效、灵活且用户友好的播放环境…...

我们来学mysql -- 事务并发之不可重复读(原理篇)
事务并发之不可重复读 题记不可重复读系列文章 题记 在《事务之概念》提到事务对应现实世界的状态转换,这个过程要满足4个特性这世界,真理只在大炮射程之类,通往和平的道路,非“常人”可以驾驭一个人生活按部就班,人多…...

ABAQUS进行焊接仿真分析(含子程序)
0 前言 焊接技术作为现代制造业中的重要连接工艺,广泛应用于汽车、船舶、航空航天、能源等多个行业。焊接接头的质量和性能直接影响到结构件的安全性、可靠性和使用寿命。因此,在焊接过程中如何有效预测和优化焊接过程中的热效应、应力变化以及材料变形等问题,成为了焊接研…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...