Docker 镜像体积优化实践:从基础镜像重建到层压缩的全流程指南

​ 由于最近在发布的时候发现docker镜像体积变得越来越大,导致整个打包发布流程变得非常耗时了。所以又接到一个差事,优化最终镜像体积。顺便也记录一下docker镜像体积优化的一些步骤。

大概步骤可以分为以下几个步骤:

  • 重做基础镜像,因为原基础镜像提交就已经占用了500M,所以计划使用alpine重新制作。
  • 优化Dockerfile文件,合并一些指令来减小镜像层数,删除一些临时文件等。
  • 最后是对基于重制的基础镜像打包发布镜像后进行镜像层数压缩(docker-squash)。
一、重做基础镜像

文件目录如下:

1730446104208-2024-11-115:28:25.png

Dockerfile-alpine-openjdk

我这基础镜像需要安装 jdk8、 python2、系统级cron组件(supercronic)

FROM  docker.m.daocloud.io/alpine:3.14LABEL maintainer="傲寒 <wanngziyi@gmail.com>"# 设置工作目录
WORKDIR /opt/aohanCOPY ./get-pip.py /opt/aohan/
COPY ./supercronic /usr/local/bin/supercronic# 替换 Alpine 的默认镜像源为国内源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \# 安装openjdk8 python2&& apk add --no-cache openjdk8 python2 shadow bash curl tzdata \&& ln -sf /bin/bash /bin/sh \&& chmod +x /usr/local/bin/supercronic \# 安装pip&& python get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple \&& rm get-pip.py \&& pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ \&& python2 -m pip install six requests jinja2# 设置 环境变量
ENV JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
ENV PATH=$JAVA_HOME/bin:$PATH
ENV PS1='[\u@\h \W]\$ '# 默认命令
CMD ["/bin/bash"]

使用docker build 命令镜像制作

# 不使用缓存
docker build --no-cache -f ./Dockerfile-alpine-openjdk -t openjdk8-python2:v1.0.0 .

效果还不错只有200M 比之前的小了快300M

image-20241101154056188-2024-11-115:41:42.png

二、Dockerfile优化

我们自己的不方便展示主要就是

  • 使用上边新的基础镜像。

  • 优化指令减少层数。

  • 删除临时文件。

三、压缩镜像
1、docker-squash是什么?
  1. 定义
    • docker-squash是一个用于压缩 Docker 镜像的工具。Docker 镜像是由一系列的层(layers)组成的,在构建和使用过程中,这些层会逐渐累积。docker-squash可以将这些多层的 Docker 镜像压缩成一个单一层的镜像,从而减小镜像的大小。
  2. 工作原理
    • 当构建 Docker 镜像时,每一个指令(如RUNCOPY等)都会在基础镜像之上创建一个新的层。随着时间的推移和构建步骤的增加,镜像会包含许多层。docker-squash通过将这些层合并,消除了层与层之间的冗余部分。例如,如果一个镜像有多个层,其中有些层可能包含相同的文件或者依赖,docker-squash会把这些重复的部分整合,生成一个更紧凑的镜像。
2、安装使用
pip install docker-squash

然后直接使用,其他参数可以查阅一下文档。

docker-squash -t 新镜像名称 原镜像名称

以下是压缩结果 压缩了36.9% 一下减少600M 效果还是非常不错的。

1730447743812-2024-11-115:55:44.png

效果不错这下又可以交差,又能开开心心划水。

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

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

相关文章

[linux 驱动]PWM子系统详解

目录 1 描述 2 结构体 2.1 pwm_chip 2.2 pwm_ops 2.3 pwm_device 2.4 pwm_class 3 相关函数 3.1 注册与注销 PWM 控制器 3.1.1 pwmchip_add 3.1.2 pwmchip_remove 3.2 申请与释放 PWM 设备 3.2.1 pwm_request 3.2.2 devm_pwm_get 3.2.3 pwm_free 3.3 控制 PWM …

Linux入门(2)

林纳斯托瓦兹 Linux之父 1. echo echo是向指定文件打印内容 ehco要打印的内容&#xff0c;不加任何操作就默认打印到显示器文件上。 知识点 在Linux下&#xff0c;一切皆文件。 打印到显示器&#xff0c;显示器也是文件。 2.重定向 >重定向操作&#xff0c;>指向的…

如何判断本地DNS是否污染

本地DNS污染是一种比较复杂且会对网络访问产生负面影响的现象。DNS即域名系统&#xff0c;它的主要功能是将便于人们记忆的域名转换为计算机能够理解的IP地址。本地DNS污染是指在本地网络环境中&#xff0c;DNS解析过程受到恶意干扰或错误配置的影响&#xff0c;使得域名被解析…

线程池使用实战

线程池使用实战 1. 线程池使用1.1 例子11.2 例子2 1. 线程池使用 // 使用 ThreadPoolExecutor 创建线程池private final ThreadPoolExecutor executorService new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), // 核心线程数Runtime.ge…

asp.net网站项目如何设置定时器,定时获取数据

在 Global.asax.cs 文件中编写代码来初始化和启动定时器。Global.asax.cs 文件定义了应用程序全局事件&#xff0c;比如应用程序的启动和结束。在这里&#xff0c;我们将在应用程序启动时初始化和启动定时器。 using System; using System.Timers;public class Global : Syste…

【数据仓库】Hive 拉链表实践

背景 拉链表是一种数据模型&#xff0c;主要是针对数据仓库设计中表存储数据的方式而定义的&#xff1b;顾名思义&#xff0c;所谓拉链表&#xff0c;就是记录历史。记录一个事务从开始一直到当前状态的所有变化的信息。 拉链表可以避免按每一天存储所有记录造成的海量存储问题…

Mysql在oracle的安装与配置(怕忘)

1、获取iso 安装oracle:https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-24.03-LTS/ISO/x86_64/openEuler-24.03-LTS-x86_64-dvd.iso openEuler-22.03-LTS-x86_64-dvd.iso 2、安装os 手动设置固定IP,建议大家网卡vm net8 网关:x.x.x.2 DNS:114.114.114.11…

日常工作采坑,关于图片压缩哪些坑一次性踩完。

文章目录 0.前言1.代码实现2.压缩工具包的配置 0.前言 首先说明一下这个图片压缩为什么那么艰难&#xff0c;主要原因还是在于需求过于奇葩。比较奇葩的原因有如下几点&#xff1a;   1.图片是一个很大的文件&#xff0c;我长这么大还没见过这个大的文件。图下可以图片文件可…

语音识别ic赋能烤箱,离线对话操控,引领智能厨房新体验

一、智能烤箱产品的行业背景 随着科技的飞速发展&#xff0c;智能家居已经成为现代家庭的新宠。智能烤箱作为智能家居的重要组成部分&#xff0c;正逐渐从高端市场走向普通家庭。消费者对于烤箱的需求不再仅仅局限于基本的烘焙功能&#xff0c;而是更加注重其智能化、便捷化和…

LeetCode 每日一题 2024/10/28-2024/11/3

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/28 685. 冗余连接 II10/29 3211. 生成不含相邻零的二进制字符串10/30 3216. 交换后字典序最小的字符串10/31 3165. 不包含相邻元素的子序列的最大和11/1 3259. 超级饮料…

faiss用于大数据量的向量检索

背景:10亿(Billion级别)的数据应该是一个很大的数据了,尤其是维度在768+级别(还有1024,1536等),这个数据量我做了一个实验,shape为(1kw,768)的array(numpy)占内存为30G(float32格式),如果能降低为float16更好不过,但似乎faiss没有这种方法或者精度有所损失。 …

一文详解开源ETL工具Kettle!

一、Kettle 是什么 Kettle 是一款开源的 ETL&#xff08;Extract - Transform - Load&#xff09;工具&#xff0c;用于数据抽取、转换和加载。它提供了一个可视化的设计环境&#xff0c;允许用户通过简单的拖拽和配置操作来构建复杂的数据处理工作流&#xff0c;能够处理各种数…

D59【python 接口自动化学习】- python基础之异常

day59 捕获异常常见问题 学习日期&#xff1a;20241105 学习目标&#xff1a;异常 -- 75 避坑指南&#xff1a;编写捕获异常程序时经常出现的问题 学习笔记&#xff1a; 捕获位置设置不当 设置范围不当 捕获处理设置不当 嵌套try-except语法错误 总结 位置&#xff0c;范围…

深度学习在大数据处理中的应用

深度学习在大数据处理中扮演着至关重要的角色&#xff0c;其应用广泛且深入。以下是一些深度学习在大数据处理中的具体应用&#xff1a; 1. 自然语言处理&#xff08;NLP&#xff09; 深度学习技术在大数据处理中的自然语言处理方面取得了显著进展。语义理解方面&#xff0c;…

Java开发配置文件的详情教程配置文件类型

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

应审稿人要求| pseudo bulk差异分析

一、写在前面 最近有粉丝提问&#xff0c;收到了如下的审稿人意见&#xff1a; 审稿人认为在单细胞测序过程中&#xff0c;利用findMarker通过Wilcox获得的差异基因虽然考虑到了不同组别细胞数量的不同&#xff0c;但是未能考虑到每组样本数量的不同。因此作者希望纳入样本水平…

Android13 系统/用户证书安装相关分析总结(二) 如何增加一个安装系统证书的接口

一、前言 接着上回说&#xff0c;最初是为了写一个SDK的接口&#xff0c;需求大致是增加证书安装卸载的接口&#xff08;系统、用户&#xff09;。于是了解了一下证书相关的处理逻辑&#xff0c;在了解了功能和流程之后&#xff0c;发现settings中支持安装的证书&#xff0c;只…

矩阵特殊打印方式

小伙伴们大家好&#xff0c;好几天没更新了&#xff0c;主要有个比赛。从今天起继续给大家更新&#xff0c;今天给大家带来一种新的题型&#xff1a;矩阵特殊打印方式。 螺旋打印矩阵 解题思路 首先给大家看一下什么是螺旋方式打印&#xff1a; 就像这样一直转圈圈。 我想大多…

IO同步异步/阻塞非阻塞

同步和异步&#xff1a;当前线程是否需要等待方法调用执行完毕。 阻塞和非阻塞&#xff1a;当前接口数据还未准备就绪时&#xff0c;线程是否被阻塞挂起 同步和异步其实是处理框架这种高层次维度来看待问题的&#xff0c;而阻塞和非阻塞往往是针对底层的系统调用方法来抉择&a…

C语言 流程控制语句

时间&#xff1a;2024.11.5 一、学习内容 流程控制语句&#xff1a; 通过一些语句&#xff0c;控制程序的执行流程。 1、顺序结构 从上往下依次执行&#xff0c;是程序默认的执行过程。 2、if的第一种格式 if(关系表达式) { 语句体&#xff1b; } //考试奖励&#xff1a;…