【Docker】基于华为 openEuler 应用 Docker 镜像体积压缩

书接 openEuler 系列文章(可以翻看测试系列),本次跟大家说说如何将 Java 包轻量化地构建到 openEuler 镜像中且保持镜像内操作系统是全补丁状态。

之前我们都是使用现成的 jdk 镜像进行构建的,如下图:

FROM ibm-semeru-runtimes:open-8u392-b08-jre-jammyVOLUME /tmp
ADD compress-example-0.0.1.jar /home
WORKDIR /home/
ENTRYPOINT ["java","-jar","compress-example-0.0.1.jar"]

这样构建的速度又快又轻量化,如下图:

yuanzhenhui@MacBook-Pro target % docker build -t compress-example1 .
[+] Building 2.3s (8/8) FINISHED                                                                                                     docker:desktop-linux=> [internal] load build definition from Dockerfile                                                                                                 0.0s=> => transferring dockerfile: 542B                                                                                                                 0.0s=> [internal] load .dockerignore                                                                                                                    0.0s=> => transferring context: 2B                                                                                                                      0.0s=> [internal] load metadata for docker.io/library/ibm-semeru-runtimes:open-8u392-b08-jre-jammy                                                      0.0s=> [internal] load build context                                                                                                                    0.5s=> => transferring context: 50B                                                                                                                     0.4s=> CACHED [1/3] FROM docker.io/library/ibm-semeru-runtimes:open-8u392-b08-jre-jammy                                                                 0.0s=> [2/3] ADD compress-example-0.0.1.jar /home                                                                                                       1.4s=> [3/3] WORKDIR /home/                                                                                                                             0.0s=> exporting to image                                                                                                                               0.3s=> => exporting layers                                                                                                                              0.2s=> => writing image sha256:2543f431ddd2bc33b1448711965bd376a5a1849034519da7d22eec34779d3851                                                         0.0s=> => naming to docker.io/library/compress-example1                                                                                                 0.0sWhat's Next?View summary of image vulnerabilities and recommendations → docker scout quickview

最终结果是原始镜像 256MB,测试应用镜像299MB。如下图:

yuanzhenhui@MacBook-Pro target % docker images
REPOSITORY                              TAG                        IMAGE ID       CREATED         SIZE
compress-example1                       latest                     2543f431ddd2   4 seconds ago   299MB
ibm-semeru-runtimes                     open-8u392-b08-jre-jammy   5dd0d62cb035   4 days ago      256MB

但奈何我们有业务方面有“信创”的要求,所有第三方软件都需要“国产化”。为此选择了华为的 openEuler 作为操作系统,镜像方面也是采用华为的 openEuler 为原始镜像。下载 openEuler 最新镜像(23.09)进行验证,发现镜像中并没有安装 JDK。于是我们在接下来的构建中其实还需要安装 JDK 并进行环境变量配置。如下图:

# 基础镜像
FROM openeuler/openeuler:23.09# 上传同级目录中的毕昇jdk到镜像根目录
ADD bisheng-jre-8u392-linux-x64.tar.gz .# 在镜像内执行系统更新,保证镜像内系统已安装最新补丁(这里采用连接符来进行串联处理能够有效减少构建体积)
RUN yum update -y && \
yum upgrade -y && \
yum install fontconfig -y && \
yum autoremove -y && \
mv bisheng-jre1.8.0_392 java# 设置jdk变量
ENV JAVA_HOME /java
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATH# 设置系统编码(这里可以参考我之前为 openEuler 写的测试系列文章,里面会有答案的)
ENV LC_ALL C.utf8
ENV LANG C.utf8# 挂载文件夹路径
VOLUME /tmp# 上传jar包到制定目录
ADD compress-example-0.0.1.jar /home# 指定工作目录
WORKDIR /home/# 执行语句
ENTRYPOINT ["java","-jar","compress-example-0.0.1.jar"]

如果你像我一样没有提前下载 openEuler 镜像,那么构建的时间将会再进一步延长,如下图:

yuanzhenhui@MacBook-Pro target % docker build -t compress-example2 .  
[+] Building 61.1s (10/10) FINISHED                                             docker:desktop-linux=> [internal] load .dockerignore                                                               0.0s=> => transferring context: 2B                                                                 0.0s=> [internal] load build definition from Dockerfile                                            0.0s=> => transferring dockerfile: 1.08kB                                                          0.0s=> [internal] load metadata for docker.io/openeuler/openeuler:23.09                            0.0s=> CACHED [1/5] FROM docker.io/openeuler/openeuler:23.09                                       0.0s=> [internal] load build context                                                               0.7s=> => transferring context: 46.93MB                                                            0.7s=> [2/5] ADD bisheng-jre-8u392-linux-x64.tar.gz .                                              1.4s=> [3/5] RUN yum update -y && yum upgrade -y && yum install fontconfig -y && yum autoremove   57.3s=> [4/5] ADD compress-example-0.0.1.jar /home                                                  0.3s => [5/5] WORKDIR /home/                                                                        0.0s => exporting to image                                                                          1.2s => => exporting layers                                                                         1.2s => => writing image sha256:1276428318f6f92f25ef16b064af257cc6add2c82a471e351d0fd501b607f508    0.0s => => naming to docker.io/library/compress-example2                                            0.0s What's Next?View summary of image vulnerabilities and recommendations → docker scout quickview

这个构建速度的确是有点慢要差不多一分钟,大部分时间都耗费在 yum 更新的那些事情上面了。我们再看看这个体积大小,如下图:

yuanzhenhui@MacBook-Pro target % docker images
REPOSITORY                              TAG                        IMAGE ID       CREATED          SIZE
compress-example2                       latest                     1276428318f6   3 minutes ago    614MB
compress-example1                       latest                     2543f431ddd2   27 minutes ago   299MB
ibm-semeru-runtimes                     open-8u392-b08-jre-jammy   5dd0d62cb035   4 days ago       256MB
openeuler/openeuler                     23.09                      09c854b5d453   2 months ago     210MB

这个测试应用镜像 2 竟然有 614MB,几乎是原镜像的 3 倍。究竟为什么会出现 3 倍的情况呢?由什么原因造成的呢?这个我们只需要使用 Docker Desktop 来看看就好了,如下图:

image.png
不得不说这个 Docker Desktop 真的非常好用。通过镜像分析就可以知道,多出来的体积一个是来自毕昇 jdk 的上传导致的,另外一个就是应用 jar 包的体积(出现风险先忽略不计哈),还有执行 RUN 指令后进行了系统更新这个也会产生新的体积。前两个是没有办法的啦。要用国产 jdk,又要上传应用 jar ,难道不用么?那么能够压缩的就只能是 yum 更新的这部分内容了。还有右侧告诉了我们究竟更新了什么内容,我们可以将不要的 package 摘录出来,在构建的时候用 yum remove 删除掉就好。为此,我们先运行一下 openeuler/openeuler:23.09 原始镜像,如下图:

yuanzhenhui@MacBook-Pro target % docker run -it openeuler/openeuler:23.09 /bin/bash

接着使用 yum list installed 命令看看有哪些已安装但没有用的包,这个过程比较漫长就不再文章里面说明了,因为这涉及到验证(毕竟怕删错了一些依赖组件)。最终的Dockerfile 如下所示:

# 基础镜像
FROM openeuler/openeuler:23.09# 上传同级目录中的毕昇jdk到镜像根目录
ADD bisheng-jre-8u392-linux-x64.tar.gz .# 在镜像内执行系统更新,保证镜像内系统已安装最新补丁(由于镜像只做 java web 的部署和使用,这里可以将一下不需要的调试包和工具删除)
RUN yum update -y && \
yum upgrade -y && \
yum install fontconfig -y && \
yum remove vim-minimal -y && \
yum remove tar -y && \
yum remove bc -y && \
yum remove gdb-gdbserver -y && \
yum autoremove -y && \
yum clean all && \
mv bisheng-jre1.8.0_392 java# 设置jdk变量
ENV JAVA_HOME /java
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATH# 设置系统编码
ENV LC_ALL C.utf8
ENV LANG C.utf8# 挂载文件夹路径
VOLUME /tmp# 上传jar包到制定目录
ADD compress-example-0.0.1.jar /home# 指定工作目录
WORKDIR /home/# 执行语句
ENTRYPOINT ["java","-jar","compress-example-0.0.1.jar"]

得到的最终结果是这样的,如下图:

yuanzhenhui@MacBook-Pro target % docker build -t compress-example3 .
[+] Building 52.6s (10/10) FINISHED                                                                                                                                   docker:desktop-linux=> [internal] load .dockerignore                                                                                                                                                     0.0s=> => transferring context: 2B                                                                                                                                                       0.0s=> [internal] load build definition from Dockerfile                                                                                                                                  0.0s=> => transferring dockerfile: 1.21kB                                                                                                                                                0.0s=> [internal] load metadata for docker.io/openeuler/openeuler:23.09                                                                                                                  0.0s=> [1/5] FROM docker.io/openeuler/openeuler:23.09                                                                                                                                    0.0s=> [internal] load build context                                                                                                                                                     0.0s=> => transferring context: 246B                                                                                                                                                     0.0s=> CACHED [2/5] ADD bisheng-jre-8u392-linux-x64.tar.gz .                                                                                                                             0.0s=> [3/5] RUN yum update -y && yum upgrade -y && yum install fontconfig -y && yum remove vim-minimal -y && yum remove tar -y && yum remove bc -y && yum remove gdb-gdbserver -y &&   51.4s=> [4/5] ADD compress-example-0.0.1.jar /home                                                                                                                                        0.1s=> [5/5] WORKDIR /home/                                                                                                                                                              0.0s => exporting to image                                                                                                                                                                0.9s => => exporting layers                                                                                                                                                               0.9s => => writing image sha256:27c6709bae124f79cdabb6302369216c0bf04e4d1410f4034c587f72b9fd3f5a                                                                                          0.0s => => naming to docker.io/library/compress-example3                                                                                                                                  0.0s What's Next?View summary of image vulnerabilities and recommendations → docker scout quickview

构建的时间比之前的还少了几秒,最后看看这几次构建的结果,如下图:

yuanzhenhui@MacBook-Pro target % docker images
REPOSITORY                              TAG                        IMAGE ID       CREATED              SIZE
compress-example3                       latest                     27c6709bae12   About a minute ago   539MB
compress-example2                       latest                     1276428318f6   2 hours ago          614MB
compress-example1                       latest                     2543f431ddd2   2 hours ago          299MB

测试应用 3 镜像比测试应用 2 镜像体积要更小了。
至此,原生的 Docker 镜像压缩方案完成。

那么为什么要做镜像压缩呢?其实之前一直没有留意到镜像太大的问题(可能之前大部分时间都是直接拿 Docker hub 里 OpenJDK 厂家做好的镜像来构建,出来体积不会太大因此在转“信创”业务线之后也一直没有留意),直到运维那边反馈说应用包太大导致每次发布拉取的时间极长。后来到 UAT 服务器上看了一下。如下图:

REPOSITORY                  TAG               IMAGE ID       CREATED             SIZE
xxx/uat/chain-evaluate     12151627          e1808f7ff397   5 days ago          1.72GB
xxx/uat/chain-service      12151626          9078e026a429   5 days ago          1.72GB

好家伙,每个镜像都几乎有 1.5 GB 以上。除了网络小水管有问题外,日后镜像私库也会告急。这…就只能想办法来压缩一下。
其实最好的做法就是看看有没有第三方的工具直接对成品镜像进行压缩。

您可别说还真有,网上比较火的就是 docker-slim(slimtoolkit)和 docker-squash 两款工具。经实测,两款工具是真的强大。唯一的缺点就是配置参数也有点多了(其实 docker-squash 还可以但 docker-slim 就…),像我这种想“开(偷)箱(懒)即(省)用(事)”的人来说还是有点麻烦。

为此就选择在构建的时候去场景进行精简处理,毕竟 Dockerfile 还是挺灵活的,指令用起来就像直接操作系统一样。最最最重要的一点是,用第三方工具一不留神有可能连关键功能都给你“嘎”掉,而你当时是不知道的,到上生产之后出现故障了才发现,又要排查一段时间…这些都是次生风险。与其这样,还不如老老实实从自己清晰的方向出发吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/237953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能数字人1688直播软件系统源码有哪些适用的场景?

智能数字人1688直播软件系统源码适用于多个场景,小编给大家列举了一些。 以下是部分代码的示例: 适用场景: 1.电商直播:1688智能数字人直播软件系统源码可以用于电商直播平台,为商家提供智能化的直播服务。数字人主播…

macOS制作dmg包

macOS制作dmg包 准备:磁盘工具、以及要制作的软件,这里以Firefox为例 图片素材 背景图: 找到Firefox,点击显示简介,查看包的大小 打开磁盘工具 文件–>新建映像–>空白映像 填写信息,大小…

nodejs微信小程序+python+PHP个性化书籍推荐系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

静态HTTP:构建高效、可扩展的Web应用程序的基础

静态HTTP是Web应用程序的重要组成部分,它为构建高效、可扩展的Web应用程序提供了坚实的基础。下面将详细介绍静态HTTP的优势和在Web应用程序中的作用。 一、静态HTTP的优势 高效性能:静态HTTP内容在服务器上预先生成,然后通过HTTP协议传输到…

CloudPulse:一款针对AWS云环境的SSL证书搜索与分析引擎

关于CloudPulse CloudPulse是一款针对AWS云环境的SSL证书搜索与分析引擎,广大研究人员可以使用该工具简化并增强针对SSL证书数据的检索和分析过程。 在网络侦查阶段,我们往往需要收集与目标相关的信息,并为目标创建一个专用文档&#xff0c…

智慧互联网银行引领金融变革,开源网安VulHunter护航数字化发展

某银行作为国内知名的互联网银行,以构建“智慧型互联行”为总体战略目标,始终坚持科技赋能金融的理念。通过AI、大数据、云计算等数字技术与金融业务的探索融合,实现以更低的成本为客户提供便捷、高效和优质体验的互联网金融服务。 架构升级助…

DBeaver中使用外部格式化程序对进行sql格式化

本文介绍了如何在DBeaver中使用pgFormatter、sqlprase、sqlformatter等外部格式化程序对sql进行格式化。 目录 一、pgFormatter 1.准备工作 2.DBeaver中进行配置 二、sqlprase 1.准备工作 2.在DBeaver中配置 三、sql-formatter 1.准备工作 2.在DBeaver中配置 一、pgF…

防火墙安全策略

目录 一、防火墙种类 二、防火墙流量控制手段 1、包过滤技术(传统) 2、状态检测技术 (1)、状态检测机制 三、安全实验 1、拓扑 2、需求 3、配置思路 4、关键配置截图 5、验证 一、防火墙种类 对于防火墙来说就是针对哪…

选型前必看,CRM系统在线演示为什么重要?

在CRM挑选环节中,假如企业需要深入了解CRM管理系统的功能和功能,就需要CRM厂商提供在线演示。简单的说,就是按照企业的需要,检测怎样通过CRM进行。如今我们来谈谈CRM在线演示的作用。 在线演示 1、了解CRM情况 熟悉系统功能&…

姿态识别、目标检测和跟踪的综合应用

引言: 近年来,随着人工智能技术的不断发展,姿态识别、目标检测和跟踪成为了计算机视觉领域的热门研究方向。这三个技术的综合应用为各个行业带来了巨大的变革和机遇。本文将分别介绍姿态识别、目标检测和跟踪的基本概念和算法,并探…

基于Java开发的微信约拍小程序

一、系统架构 前端:vue | element-ui 后端:springboot | mybatis 环境:jdk8 | mysql8 | maven | mysql 二、代码及数据库 三、功能说明 01. 首页 02. 授权登录 03. 我的 04. 我的-编辑个人资料 05. 我的-我的联系方式 06. …

等待队列头实现阻塞 IO(BIO)

文章目录 等待队列头实现阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 等待队列头实现阻塞 IO(BIO) 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构,链表头和…

苹果如何从iCloud恢复备份?正确方法看这里!

iCloud为所有苹果用户免费提供5G内存空间,用户可以将照片、短信、联系人、备忘录等重要信息备份到iCloud云端,这样可以方便在不同设备之间同步和共享。 同时,iCloud保证这些数据在所有苹果设备上及时自动更新。当遇到手机数据丢失时&#xf…

构建搜索引擎,而非向量数据库(Vector DB) [译]

原文:Build a search engine, not a vector DB 作者: Panda Smith 在过去 12 个月中,我们见证了向量数据库(Vector DB)创业公司的迅猛增长。我此刻并不打算深入探讨它们各自的设计取舍。相反,我更想探讨和…

做外贸多想一步,多走一步

最近在网上给小儿买了一个液晶画画板,自从告诉小儿已经购物需要耐心等待之后,几乎每天小儿要询问几遍,快递到哪里了? 好不容易盼到了,结果打开一看却是个坏的,虽然外包装是好的,但是明显这个快…

数据库客户案例:每个物种都需要一个数据库!

1、GERDH——花卉多组学数据库 项目名称:GERDH:花卉多组学数据库 链接地址:https://dphdatabase.com 项目描述:GERDH包含了来自150多种园艺花卉植物种质的 12961个观赏植物。将不同花卉植物转录组学、表观组学等数据进行比较&am…

读《文明之光》第四册总结

今天来给大家分享一下【吴军】老师的《文明之光》,该书全套共四册,今天给大家分享的是第四册。 人总是要有些理想和信仰。初读这本书,就被本书的第一句话说感动过。 当人们问起我的理想时,我就给他们讲…

Patreon怎么订阅付款?Patreon会员订阅付款保姆级教程,用虚拟VISA卡订阅Patreon作者艺术家

Patreon 是目前世界上最受欢迎的会员平台之一。 内容创作者和艺术家通常很难让粉丝在经济上支持他们。 通过使用像 Patreon 这样的平台,创作者和艺术家可以很容易地从他们的作品中获得报酬。粉丝也能更方便的支持他们,今天就教大家如何订阅Patreon 首先我…

Python中最常用的10个内置函数!

Python作为一种多用途编程语言,拥有丰富的内置函数库,这些函数可以极大地提高开发效率。本文将介绍Python中最常用的10个内置函数,它们的功能各有不同,但在实际编程中经常派上用场。我们将深入了解每个函数,并提供示例…

解锁高效工作!5款优秀工时管理软件推荐

工时管理,一直是让许多企业和团队头疼的问题。传统的纸质工时表、复杂的电子表格,不仅操作繁琐,还容易出错。幸好,随着科技的进步,我们迎来了工时管理软件的春天。今天,就让我们一起走进这个新时代&#xf…