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

news2024/12/24 3:25:54

书接 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.coloradmin.cn/o/1327288.html

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

相关文章

力扣每日一题day36[112.路径总和]

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点…

云原生系列3-Kubernetes

1、Kubernetes概述 k8s缩写是因为k和s之间有八个字符。k8s是基于容器技术的分布式架构方案。官网:https://kubernetes.io/zh-cn/ Google在 2014年开源了Kubernetes项目,Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。同样类似的…

three.js实战模拟VR全景视图

文章中使用到的案例图片都来源于&#xff1a;Humus - Textures 里面有很多免费的资源&#xff0c;可以直接下载&#xff0c;每个资源里面都提供6个不同方位的图片&#xff0c;我们通过threejs稍微处理一下&#xff0c;就能实现以下3D效果的场景了。 <template><div …

aws-waf-cdn 基于规则组的永黑解决方案

1. 新建waf 规则组 2. 为规则组添加规则 根据需求创建不同的规则 3. waf中附加规则组 &#xff08;此时规则组所有规则都会附加到waf中&#xff0c;但是不会永黑&#xff09; 此刻&#xff0c;可以选择测试下规则是否生效&#xff0c;测试前确认保护资源绑定无误 4. 创建堆…

【Docker-5】镜像编排

Dockerfile语法 制作apache镜像 httpd.service 文件路径&#xff1a;/lib/systemd/system/httpd.service [rootdocker-0002 ~]# mkdir apache [rootdocker-0002 ~]# cd apache拷贝动态页面到docker-0002的/root/apache/ [rootecs-proxy ~]# scp /root/5/public/info.php 192.…

智慧工地一体化云平台APP源码:监管端、工地端、危大工程、智慧大屏、物联网、塔机、吊钩、升降机

智慧工地管理平台是依托物联网、互联网建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。 智慧工地源码技术说明 1.微服务架构JavaSpring Cloud UniApp MySql 2.支持多端展示&#xff08;PC端、手…

网络爬虫 动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能和在浏览器中看到的不一样&#xff0c;在浏览器中可以看到正常显示的页面教据&#xff0c;但是使用 requests 得到的结果并没有&#xff0c;这是因为requests 获取的都是原始的 HTML 文档…

C#合并多个Word文档(微软官方免费openxml接口)

g /// <summary>/// 合并多个word文档&#xff08;合并到第一文件&#xff09;/// </summary>/// <param name"as_word_paths">word文档完整路径</param>/// <param name"breakNewPage">true(默认值)&#xff0c;合并下一个…

CSS3过渡与动画,2D与3D

背景和边框 1. border-image 该属性用于定义元素边框的背景图像 语法&#xff1a;border-image:none | url(img) imagesection [/imagewidth] imaghandling 其中imagesection定义用于边框不同部分的图像部分。imagesection值可以由图像上的4条分隔线组成&#xff0c;每条线以…

华为配置BGP的基本示例

组网需求 如图1所示&#xff0c;需要在所有Switch间运行BGP协议&#xff0c;SwitchA、SwitchB之间建立EBGP连接&#xff0c;SwitchB、SwitchC和SwitchD之间建立IBGP全连接。 说明 请确保该场景下互联接口的STP处于未使能状态。因为在使能STP的环形网络中&#xff0c;如果用交…

Docker部署 flowable-ui 进行流程建模

Docker部署 flowable-ui 进行流程建模 简介 安装Docker Desktop,本篇无安装步骤安装正常打开运行后&#xff0c;正式开始部署flowable-uicmd执行拉取镜像操作docker pull flowable/flowable-uicmd启动镜像docker run -d --name flowable -p 8081:8080 flowable/flowable-ui修…

最新国内可用使用GPT4.0,GPT语音对话,Midjourney绘画,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GP…

2023 年最佳物联网应用开发平台

您是否知道物联网应用程序开发平台是一个令人惊叹的概念&#xff0c;它改变了我们的做事方式&#xff1f;这一切都是为了连接事物&#xff0c;比如你的智能手机和你的房子。所以&#xff0c;想象一下&#xff1a;您正在房间里放松&#xff0c;您想让房间变得舒适。 您无需起身…

大数据知识图谱解码:从核心概念到技术实战

文章目录 大数据知识图谱解码&#xff1a;从核心概念到技术实战1. 概述什么是知识图谱知识图谱与自然语言处理的关系 2. 发展历程语义网络本体论大数据时代的知识图谱知识图谱与深度学习的融合 3. 研究内容知识图谱的建模与表示知识抽取知识图谱的融合与对齐知识图谱的推理知识…

[XR806开发板试用] XR806——基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发&#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则&#xff0c;发现大家的重心都放在开发中的环境构建过程&#xff0c;缺少了不少实际应用场景的运用&am…

安卓好用的python编辑器,安卓平台python编辑器

本篇文章给大家谈谈安卓上好用的python编辑软件有哪些&#xff0c;以及安卓上好用的python编辑软件推荐&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 1. 简介 Thonny是基于python内置图形库tkinter开发出来的支持多平台(windows,Mac,Linux)的python IDE&am…

Dubbo的学习笔记

目录 架构 zookeeper的简单介绍 简单案例 Dubbo-admin的简单使用 Dubbo高级特性 序列化 地址缓存 超时与重试 多版本 负载均衡 集群容错 服务降级 Dubbo是阿里巴巴开源的一个高性能、轻量级RPC框架 架构 provider&#xff1a;暴露服务的服务提供方container&#x…

React学习计划-React16--React基础(三)收集表单数据、高阶函数柯里化、类的复习

1. 收集表单数据 包含表单的组件分类 受控组件——页面中所有输入类的DOM,随着输入&#xff0c;把值存维护在状态里&#xff0c;需要用的时候去状态里取值&#xff08;推荐&#xff0c;避免了过渡使用ref&#xff09;非受控组件——页面中所有输入类的DOM&#xff0c;现用现取…

【Vulnhub 靶场】【ContainMe: 1】【简单-中等】【20210729】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/containme-1,729/ 靶场下载&#xff1a;https://download.vulnhub.com/containme/THM-ContainMe-v4.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年07月29日 文件大小&#xff1a;2.2 GB 靶…

文件的查看与管理

目录 一、命令之-----cat &#xff08;一&#xff09;查看文本文件内容 &#xff08;二&#xff09;合并文件内容 &#xff08;三&#xff09;创建文件 &#xff08;四&#xff09;追加内容到文件 二、管道符的作用 三、分页显示 &#xff08;一&#xff09;命令之…