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

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

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

FROM ibm-semeru-runtimes:open-8u392-b08-jre-jammy

VOLUME /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.0s

What'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.mfbz.cn/a/262078.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装(CentOS)+简单使用

Docker安装(CentOS) 一键卸载旧的 sudo yum remove docker* 一行代码(自动安装) 使用官方安装脚本 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 启动 docker并查看状态 运行镜像 hello-world docker run hello-world 简单使用 使用 docker run …

第八节TypeScript 函数

1、函数的定义 函数就是包裹在花括号中的代码块,前面使用关键字function。 语法: function function_name() {// 执行代码 } 实例: function test() { // 函数定义console.log("我就是创建的名称为test的函数") } 2、调用…

论文阅读——RS DINO

RS DINO: A Novel Panoptic Segmentation Algorithm for High Resolution Remote Sensing Images 基于MASKDINO模型,加了两个模块: BAM:Batch Attention Module 遥感图像切分的时候把一个建筑物整体比如飞机场切分到不同图片中,…

五分钟学完k-means

聚类算法有很多种,K-Means 是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。 K-Means 聚类算法的大致意思就…

Ubuntu18.04、CUDA11.1安装TensorRT

最近想试试推理加速,因为跑的预测有点慢,一开始是打算从数据处理上实现,采用并行数据处理,但是这个有所难度,而且有几张显卡可用,就想着怎么把显卡利用上。而且了解到推理加速后,就先尝试一下看…

1.0.0 IGP高级特性简要介绍(ISIS)

ISIS高级特性 1.LSP快速扩散 ​ 正常情况下,当IS-IS路由器收到其它路由器发来的LSP时,如果此LSP比本地LSDB中相应的LSP要新,则更新LSDB中的LSP,并用一个定时器定期将LSDB内已更新的LSP扩散出去。 IS-IS如何识别LSP的新旧&#x…

[每周一更]-(第35期):为何要用ChatGPT?

为何要用ChatGPT?因为她是工具,而人类需要工具; AI只要没有自主目的性的话就是工具,需要怕的是使用这个工具的人。掌握了提问的艺术,更好利用AI帮助我们完成目标; 最开始2022/12/07 开始注册ChatGPT使用&a…

【C++】开源:libmodbus通信协议库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍libmodbus通信协议库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#x…

PDF控件Spire.PDF for .NET【安全】演示:将加密或解密 PDF 文件

当涉及到在 Internet 上共享机密文档时,PDF 加密是一项至关重要的任务。通过使用强密码加密 PDF 文件,您可以保护文件数据免遭未经授权的人员访问。在某些情况下,可能还需要删除密码才能公开文档。在本文中,您将了解如何使用Spire…

ChatGPT一周年:开源语言大模型的冲击

自2022年末发布后,ChatGPT给人工智能的研究和商业领域带来了巨大变革。通过有监督微调和人类反馈的强化学习,模型可以回答人类问题,并在广泛的任务范围内遵循指令。在获得这一成功之后,人们对LLM的兴趣不断增加,新的LL…

mac电池最大充电限制 AlDente Pro中文 for Mac

热保护:在电池温度较高时为电池充电会导致电池老化更快。启用热保护后,当电池温度过高时,充电将自动停止。 航行模式:通常情况下,即使激活了最大电池充电,您的 MacBooks 电池也会始终稍微充电和放电以保持所…

linux 驱动——私有数据

文章目录 linux 驱动中的私有数据container_of驱动程序数据结构定义 应用程序模块使用 linux 驱动中的私有数据 前面的程序中,都只申请了一个从设备号,这里使用 alloc_chrdev_region 分配两个设备号,这两个设备共用 ops 方法。 所以需要在 …

案例101:基于微信小程序的停车共享小程序

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现

基于JavaSpringbootVueelememt宠物用品商城系统设计实现 🍅 作者主页 程序开发 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录 基于JavaSpringbootVueelememt宠物用品商城系统设计实…

CGAL的3D Alpha Shapes

假设我们给定一个二维或三维的点集S,我们希望得到类似“这些点形成的形状”的东西。这是一个相当模糊的概念,可能有许多可能的解释,阿尔法形状就是其中之一。阿尔法形状可用于从密集的无组织数据点集进行形状重建。事实上,阿尔法形…

跑马灯实验

4.1 实验目的 1.熟悉龙芯实验开发板、熟悉 VIVADO 的编译环境及操作流程。 2.掌握 FPGA 编程入门知识、利用门级方法实现简单逻辑电路。 3.继续学习 Verilog HDL 语法、掌握跑马灯的设计、熟悉调试过程。 4.2 实验原理及芯片 本次实验用 Verilog HDL 语言来描述 6 个不同的 …

【Spring Security】打造安全无忧的Web应用--进阶篇

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.导入相关配置 1.pom 2.ym…

redis基本用法学习(C#调用NRedisStack操作redis)

redis官网文档中推荐C#中使用NRedisStack包连接并操作redis,本文学习C#调用NRedisStack操作redis的基本方式。   新建Winform项目,在Nuget包管理器中搜索并安装NRedisStack包,如下图所示: 主要调用StackExchange.Redis命名空间下…

Navicat里放大、缩小字体的快捷方法

我是偶然误触键盘把字体缩小了,研究以后发现的这个快捷键,分享给大家。 方法:按住【CtrlShift】组合键,再拖动鼠标滚轮,就可以缩放字体了。 缩小效果: 放大效果:

看懂PL/SQL执行计划

看懂PL/SQL执行计划 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例&#xff1…