当前位置: 首页 > news >正文

【橘子容器】如何构建一个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镜像是吧&#xff0c;作为一个开发这很正常&#xff0c;那么你用的什么打包方式呢&#xff0c;这里我们来梳理几种常用的docker镜像构建方式。 ps&#xff1a;这里不是太讲原理&#xff0c;更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…...

EFAK kafka可视化管理工具部署使用

简介&#xff1a;EFAK是开源的可视化和管理软件。它允许您查询、可视化、提醒和探索您的指标&#xff0c;无论它们存储在何处。简单来说&#xff0c;它为您提供了将 Kafka 集群数据转换为漂亮的图形和可视化效果的工具。 环境&#xff1a;①操作系统&#xff1a;CentOS7.6&…...

Spring Boot 工程分层实战(五个分层维度)

1、分层思想 计算机领域有一句话&#xff1a;计算机中任何问题都可通过增加一个虚拟层解决。这句体现了分层思想重要性&#xff0c;分层思想同样适用于Java工程架构。 分层优点是每层只专注本层工作&#xff0c;可以类比设计模式单一职责原则&#xff0c;或者经济学比较优势原…...

vscode IntelliSense Configurations

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

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的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff1a; 1. 补充C语言语法的不足&#xff0c;以及C是如何对C语言…...

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…...

用 Sass 模块化系统取代全局导入,消除 1.80.0 引入的 @import 弃用警告

目录 前言 问题 import 的缺陷 命名冲突 重复导入 模块系统 use 规则 forward 规则 实际修改 前言 最初&#xff0c;Sass 使用 import 规则通过单个全局命名空间加载其他文件&#xff0c;所有内置函数也可全局使用。由于模块系统&#xff08;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项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…...

华为云云原生中间件DCS DMS 通过中国信通院与全球IPv6测试中心双重能力检测

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;与全球IPv6测试中心相继宣布&#xff0c;华为云的分布式缓存服务&#xff08;Distributed Cache Service&#xff0c;简称DCS&#xff09;和分布式消息服务&#xff08;Distributed Message …...

PostgreSQL中事件触发器Event Trigger

在PostgreSQL中&#xff0c;事件触发器&#xff08;Event Trigger&#xff09;是一种特殊的触发器类型&#xff0c;它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同&#xff0c;事件触发器并不与特定的表或视图相关联&#xff0c;而是与数据库级别的全…...

uni.request流式(Stream)请求,实现打印机效果

最近使用扣子 - 开发指南 (coze.cn)和智谱AI开放平台开发小程序AI导诊和用药对话指南。 开发的过程中也是走了不少坑,下面就来聊聊走了哪些坑。 坑1 :coze试了v2和v3的接口,两个接口请求还是有点差别的,v2拿到了botId和accessToken可以直接请求不需要做任何处理,v3还需要…...

canvas保存图片

需求&#xff1a;上面有几个按钮&#xff0c;其中有一个切换是图片 用v-if会导致图片加载慢 实现方法&#xff1a; 一进来就加载&#xff0c;通过监听元素显示&#xff0c;用于控制canvas的宽高&#xff0c;从而达到隐藏的效果 组件dowolad.vue <template><view …...

DNS到底有什么用?

举个例子&#xff0c;对于我们来说访问的域名是www.baidu.com&#xff0c;但是实际在计算机并不认识这个域名&#xff0c;计算机是需要通过IP地址去访问这个网站&#xff0c;所以呢&#xff1f;这个时候就需要一个dns解析器&#xff0c;来把这串域名转换为IP地址给计算机去访问…...

什么是CRM系统?CRM系统的功能、操作流程、生命周期

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

美畅物联丨JS播放器录像功能:从技术到应用的全面解析

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

我们来学mysql -- 事务并发之不可重复读(原理篇)

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

ABAQUS进行焊接仿真分析(含子程序)

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

AI Agent如何重构数据分析工作流:从数据清洗到洞察生成的7步自动化闭环(附企业级架构图)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI Agent如何重构数据分析工作流&#xff1a;从数据清洗到洞察生成的7步自动化闭环&#xff08;附企业级架构图&#xff09; 传统数据分析依赖人工串联多个工具与脚本&#xff0c;耗时长、容错低、知识…...

《Java 基础必学:ArrayList、HashMap 和泛型详解》

一、引言 1.为什么这些是 Java 基础的重点&#xff1f; ArrayList、HashMap 和泛型是Java集合框架的核心组成部分&#xff0c;广泛应用于实际开发中。 ArrayList&#xff1a;基于动态数组实现&#xff0c;支持快速随机访问&#xff0c;适合频繁查询和遍历的场景。HashMap&…...

小波分析多尺度数据融合算法应用【附算法】

✨ 长期致力于小波分析、多尺度数据融合、MEMS陀螺、Allan方差研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;小波域多尺度融合定理证明与算法框架&a…...

Oracle EBS的退货处理逻辑

1.1日库存数量1个 价格20元 库存价值1*2020元&#xff0c;采用移动平均成本法2.1日PO1 采购价格 10元 数量3个 入库3个 此时库存价值为 203*1050元 平均价格为 50/412.5元3.1日PO2 采购价格 20元 数量6个 入库6个 此时库存价值为 203020*6170元 平均价格为 170/1017元5.1日PO1 …...

Claude Mythos:AI驱动的自动化漏洞挖掘与攻防范式跃迁

1. 项目概述&#xff1a;一场静默却震耳欲聋的AI能力跃迁这周&#xff0c;整个AI安全圈没有爆炸性新闻稿&#xff0c;没有铺天盖地的发布会直播&#xff0c;只有一份措辞克制、数据密集的系统卡片&#xff08;System Card&#xff09;和一份由英国AI安全研究所&#xff08;AISI…...

PINNs赋能QSPR:将物理定律编译进分子性质预测模型

1. 这不是又一个黑箱模型&#xff1a;当物理规律成为神经网络的“硬约束”你有没有试过训练一个深度学习模型去预测某种新型有机分子的沸点&#xff0c;结果在训练集上R高达0.98&#xff0c;一拿到实验室刚测出来的5个新化合物数据&#xff0c;预测误差就飙到40℃&#xff1f;我…...

从录制到规划:手把手教你用CARLA录制点云,在Autoware中构建完整自动驾驶仿真闭环

从CARLA到Autoware&#xff1a;构建自定义自动驾驶仿真场景的完整实践指南 在自动驾驶技术快速迭代的今天&#xff0c;仿真测试已成为算法验证不可或缺的环节。CARLA与Autoware作为开源仿真平台和自动驾驶框架的黄金组合&#xff0c;为研究者提供了高度灵活的测试环境。本文将深…...

洛雪音乐音源:打破音乐平台壁垒的聚合解决方案

洛雪音乐音源&#xff1a;打破音乐平台壁垒的聚合解决方案 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 你是否曾经为了听一首歌而在多个音乐平台之间来回切换&#xff1f;或者因为某个平台没有…...

5步快速上手ScriptHookV:GTA V模组开发完整指南

5步快速上手ScriptHookV&#xff1a;GTA V模组开发完整指南 【免费下载链接】ScriptHookV An open source hook into GTAV for loading offline mods 项目地址: https://gitcode.com/gh_mirrors/sc/ScriptHookV ScriptHookV是一款专为《侠盗猎车手V》&#xff08;GTA V&…...

大一新生怎么合理利用github?用好Github

使用Github也有十几年了&#xff0c;说说我的感受和日常用法如下&#xff1a; 第一想到是如何找有趣的项目&#xff0c;比如通过Gitub Trending找最近流行的项目&#xff0c;把握开源社区的风向解决问题&#xff0c;比如经常用到XX软件出Bug了&#xff0c;第一想到去对应的开源…...