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

8、Docker镜像瘦身

Docker镜像瘦身一、 常见docker镜像瘦身方法在 Docker 镜像瘦身方面有多种工具和技术可以帮助你显著减小镜像体积提升构建和部署效率。以下是常用的工具和方法1. 基础优化方法① 多阶段构建Multi-stage Builds原理在Dockerfile中使用多个FROM阶段仅保留最终需要的文件。示例# 第一阶段编译环境 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # 第二阶段运行环境仅复制二进制文件 FROM alpine:latest COPY --frombuilder /app/myapp /usr/local/bin/ CMD [myapp]效果避免将编译工具链打包到最终镜像中。② 选择最小化基础镜像优先使用alpine、distroless或scratch镜像FROM alpine:3.19 # 仅 5MB 左右 # 或 Google 的 distroless无 shell 和包管理器 FROM gcr.io/distroless/static-debian12③ 合并 RUN 命令减少镜像层数清理临时文件RUN apt-get update \ apt-get install -y curl \ rm -rf /var/lib/apt/lists/*2. 专用瘦身工具① Dive功能交互式分析镜像每层内容找出冗余文件。安装brewinstalldive# macOSsudoapt-getinstalldive# Debian/Ubuntu使用dive build-tmy-image:latest.② Docker Slim原理动态分析容器运行时的文件依赖删除未使用的文件。安装curl-sLhttps://downloads.dockerslim.com/releases/1.40.0/dist_linux.tar.gz|tar-xz使用docker-slim build--targetmy-image:latest效果可减少 50%~90% 体积。③ Skopeo Buildah场景替代docker build支持更灵活的镜像构建和压缩。buildah bud--layersfalse-tmy-image.# 禁用缓存层skopeo copy docker://my-image oci://my-image-optimized④ Whaler功能逆向分析已有镜像的构建过程找出优化点。dockerrun-v/var/run/docker.sock:/var/run/docker.sock pegleg/whaler-smy-image3. 高级技巧① 删除非必要文件手动清理缓存、文档、测试文件RUN find /usr -name *.doc -delete \ rm -rf /var/cache/apk/*② 使用 UPX 压缩二进制文件对 Go、C 等静态编译的程序进一步压缩RUN upx --best --lzma /usr/local/bin/myapp③ 分块构建适用于微服务将静态文件如前端资源分离到独立镜像通过 CDN 分发。4. 效果对比工具/方法适用场景体积减少幅度多阶段构建编译型语言Go/Rust50%~90%Alpine 基础镜像所有场景60%~80%Docker Slim已存在的镜像30%~90%Dive 分析诊断冗余文件依赖手动清理5. 自动化集成CI/CD 流水线在构建阶段加入瘦身步骤例如 GitLab CIbuild:stage:buildscript:-docker build-t my-image .-docker-slim build--target my-image通过组合使用这些工具和方法可以轻松将几百 MB 的镜像压缩到几十 MB。建议从多阶段构建和最小化基础镜像开始再通过Dive或Docker Slim进一步优化。二、 docker-slim命令docker-slim是一个用于优化 Docker 镜像的工具它通过静态分析和动态分析运行容器来瘦身镜像去除不必要的文件和依赖。以下是docker-slim的常用命令和使用方式1. 安装 Docker Slim必须使用最新版本在开始前确保已安装docker-slimhttps://github.com/slimtoolkit/slim/releases/tag/1.40.11exportPATH$PATH:/slimPath##永久生效ln-svim/etc/profile2. 基本命令1镜像分析分析镜像但不生成优化后的镜像docker-slim xray--targetIMAGE_NAME:TAG2镜像瘦身对镜像进行瘦身生成优化后的镜像docker-slim build--targetIMAGE_NAME:TAG默认会生成一个名为原镜像名.slim的新镜像。例如原镜像是nginx:alpine瘦身后生成nginx.slim:latest。3. 常用参数参数说明--target指定要优化的镜像必需--http-probe启用 HTTP 探针默认启用检测容器暴露的端口和服务--http-probe-cmd自定义 HTTP 探针的请求例如测试 API 端点--show-clogs显示容器运行时的日志--expose指定容器暴露的端口如果未自动检测到--env传递环境变量给容器例如--env VARvalue--entrypoint覆盖容器的默认入口点--cmd覆盖容器的默认命令--pull拉取目标镜像如果本地不存在--dockerfile指定 Dockerfile 路径用于补充分析–publish-exposed-ports显式发布端口–network执行网络模式4. 高级用法1自定义输出镜像名称docker-slim build--targetnginx:alpine--tagnginx:custom-slim2禁用 HTTP 探针docker-slim build--targetnginx:alpine --http-probefalse3保留指定文件/目录通过--include-path保留必要的文件docker-slim build--targetmyapp --include-path /app/configs默认会生成瘦身报告报告会保存在 执行命令时的当前目录下slim.report.json文件中。5. 示例示例 1瘦身一个 Python Flask 应用docker-slim build\--targetmy-flask-app:latest\--http-probe-cmd /api/health\--show-clogs示例 2分析但不优化镜像docker-slim xray--targetredis:alpine6. 注意事项动态分析docker-slim会临时运行容器因此确保目标镜像的默认命令/入口点能够正常启动服务。兼容性某些镜像如基于scratch的极简镜像可能不兼容。调试如果瘦身后镜像无法运行检查日志--show-clogs或使用docker-slim debug调试。7. 更多帮助查看完整文档docker-slim--helpdocker-slim build--help官方文档https://docker-slim.io/通过docker-slim你可以显著减少镜像大小通常缩减 50%-90%同时保持核心功能。二、docker-squashdocker-squash是一个用于优化 Docker 镜像的工具它可以将 Docker 镜像中的多个层layers合并为一个或多个层从而减少镜像的体积。Docker 镜像由多个层组成每一层都代表文件系统的一部分更改。虽然这种分层结构有助于提高镜像的构建效率和共享性但过多的层可能会导致镜像体积变大影响镜像的传输和存储效率。docker-squash通过将多个层合并为一个层可以有效地减少镜像的体积同时保留镜像的功能。这对于优化生产环境中的 Docker 镜像非常有用。安装docker-squashdocker-squash是一个 Python 工具可以通过pip安装pipinstalldocker-squash使用docker-squash以下是docker-squash的基本用法拉取镜像首先拉取需要优化的 Docker 镜像dockerpull your-image:tag使用docker-squash合并层运行docker-squash命令来合并镜像的层docker-squash-tyour-image:squashed your-image:tag其中-t your-image:squashed指定优化后的镜像名称和标签。your-image:tag需要优化的原始镜像。验证优化后的镜像优化完成后可以查看镜像的体积是否减小dockerimages推送优化后的镜像如果需要可以将优化后的镜像推送到 Docker Registrydockerpush your-image:squashed注意事项docker-squash会删除镜像的历史记录因此优化后的镜像将无法查看每一层的构建历史。使用docker-squash时建议在开发和测试环境中进行充分验证确保优化后的镜像功能正常。替代方案Docker 从 17.05 版本开始引入了多阶段构建multi-stage builds这是一种更优雅的优化镜像体积的方式。通过多阶段构建可以在构建过程中丢弃不必要的层从而减少最终镜像的体积。建议优先使用多阶段构建来优化镜像。总结docker-squash是一个实用的工具可以帮助减少 Docker 镜像的体积但在使用时需要注意其局限性。结合多阶段构建等 Docker 原生功能可以更好地优化镜像的体积和性能。

相关文章:

8、Docker镜像瘦身

Docker镜像瘦身 一、 常见docker镜像瘦身方法 在 Docker 镜像瘦身方面,有多种工具和技术可以帮助你显著减小镜像体积,提升构建和部署效率。以下是常用的工具和方法: 1. 基础优化方法 ① 多阶段构建(Multi-stage Builds&#xf…...

从导航软件到推荐系统:闵可夫斯基距离(Minkowski Distance)中的参数p,到底该怎么选?

从导航软件到推荐系统:闵可夫斯基距离中的参数p选择实战指南 想象一下,当你使用导航软件规划路线时,系统会提供多种路径选择——有时是蜿蜒曲折的小路,有时是笔直的高速公路。这背后隐藏着一个数学秘密:不同的路径计算…...

CSS如何利用Sass定义全局阴影方案_通过变量实现统一CSS风格

用语义化Sass变量(如$shadow-sm)统一管理box-shadow值是最轻量可持续的方案,按视觉层级而非像素分档,配合map实现多态扩展,并可生成CSS变量兼顾动态主题与编译期逻辑。如何用Sass变量统一管理box-shadow值直接结论&…...

用Python实现切比雪夫距离:从国际象棋到KNN算法的实战指南

用Python实现切比雪夫距离:从国际象棋到KNN算法的实战指南 想象一下国际象棋棋盘上的国王,它每一步可以朝任意方向移动一格——横着走、竖着走,甚至斜着走。这种看似简单的移动规则,背后隐藏着一个强大的数学概念:切比…...

用STM32CubeMX和HAL库驱动RC522 NFC模块,从零实现一个简易门禁(附完整代码)

基于STM32CubeMX与HAL库的RC522门禁系统开发实战 在智能硬件开发领域,NFC技术因其非接触式交互特性,已成为门禁系统的首选方案。本文将完整呈现如何利用STM32CubeMX图形化工具和HAL库,从零构建一个稳定可靠的RC522门禁系统。不同于传统寄存器…...

Vitis 2020.1编译MicroBlaze程序报错?别急着找CPU,先看看你的BRAM够不够用

Vitis 2020.1编译MicroBlaze程序报错?别急着找CPU,先看看你的BRAM够不够用 最近在Xilinx Vitis 2020.1环境下为MicroBlaze软核开发C程序时,遇到了一个看似简单却让人抓狂的问题——点击运行按钮后,系统弹窗提示"找不到microb…...

Java 25虚拟线程性能断崖式下跌事件复盘(附JFR火焰图+Arthas实时诊断脚本+可审计的线程生命周期规范)

第一章:Java 25虚拟线程性能断崖式下跌事件复盘(附JFR火焰图Arthas实时诊断脚本可审计的线程生命周期规范)某金融核心交易系统在升级至 JDK 25 EA build 2024-07-15 后,突发 P99 响应延迟从 8ms 暴增至 1.2s,TPS 下跌 …...

Linux RT 调度器的入队与出队:rt_enqueue_task/rt_dequeue_task

前言在工业自动化、自动驾驶、机器人控制、5G 基站等强实时性业务场景中,Linux 的SCHED_FIFO/SCHED_RR实时调度策略是保障任务确定性执行的核心。RT 调度器区别于 CFS 完全公平调度器,严格按照任务优先级抢占执行,高优先级任务一旦就绪&#…...

Linux RT 调度器的优先级数组:struct rt_prio_array 的实现

前言在工业控制、自动驾驶、航空航天、5G 基站等强实时性场景中,Linux 的 PREEMPT_RT 补丁与原生实时调度类(SCHED_FIFO/SCHED_RR)是保障系统确定性的核心基石。与 CFS 完全公平调度器基于红黑树的时间片分配不同,实时调度器的核心…...

告别玄学调试:用Wireshark抓包实战解析PCIe链路训练与有序集(TS1/TS2/EIOS全解)

从信号到问题:Wireshark抓包实战解码PCIe链路训练全流程 当一块全新的PCIe显卡无法被系统识别,或是企业级NVMe存储阵列频繁出现链路降速时,硬件工程师的调试台上总少不了一台运行Wireshark的笔记本和几个神秘的TS序列。这些看似简单的有序集&…...

告别迷茫!手把手教你用CANoe 15.0从零搭建第一个仿真工程(附DBC文件创建)

告别迷茫!手把手教你用CANoe 15.0从零搭建第一个仿真工程(附DBC文件创建) 第一次打开CANoe软件时,面对密密麻麻的菜单栏和复杂的配置选项,很多初学者都会感到无从下手。本文将带你一步步完成从工程创建到DBC文件配置的…...

告别sc.exe!用NSSM把任意exe变成Windows服务(附Frpc实战配置)

告别sc.exe!用NSSM把任意exe变成Windows服务(附Frpc实战配置) 在Windows服务器管理中,将应用程序转化为系统服务一直是运维人员的刚需。传统sc.exe命令虽然功能完整,但其晦涩的语法和有限的配置选项常让人望而生畏。当…...

DIY智能家居控制面板:用ESP8266和TM1629A打造低成本数码管时钟/温湿度显示器

DIY智能家居控制面板:用ESP8266和TM1629A打造低成本数码管时钟/温湿度显示器 周末在家捣鼓电子元件时,突然想到能不能用闲置的数码管做个既实用又酷炫的桌面小工具。于是就有了这个项目——一个不到百元成本的智能显示面板,既能精准报时又能监…...

LVGL Spinner控件调参避坑指南:从卡顿到丝滑,我只改了这两个参数

LVGL Spinner控件性能调优实战:从参数解析到流畅动画的终极方案 在嵌入式GUI开发中,加载动画的流畅度往往直接关系到用户体验的第一印象。最近在开发智能家居控制面板时,我发现一个有趣的现象:同样的LVGL Spinner控件,…...

异步电路后端实现:从CDC约束到SignOff的实战解析

1. 异步电路后端实现的核心挑战 在复杂SoC设计中,异步时钟域交叉(CDC)问题就像城市间的交通管制——不同节奏的时钟域如同不同时区的城市,数据在这些区域间传输时,稍有不慎就会引发"交通事故"。作为后端工程…...

如何快速解决苹果设备Windows连接问题:一键驱动安装终极指南

如何快速解决苹果设备Windows连接问题:一键驱动安装终极指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/…...

ESP32 + micro-ROS实战:手把手教你用Action Server做个智能小车遥控器

ESP32 micro-ROS实战:手把手教你用Action Server做个智能小车遥控器 在机器人开发领域,实时控制与反馈一直是个技术难点。想象一下,当你需要远程控制一台智能小车完成复杂动作时,简单的指令发送往往不够——你需要知道小车是否成…...

STM32+FreeModbus实战:用AHT20传感器搭建低成本温湿度监测从机(附完整代码)

STM32FreeModbus实战:用AHT20传感器搭建低成本温湿度监测从机(附完整代码) 在工业物联网和智能家居领域,温湿度监测是最基础也最普遍的需求之一。如何用最低的成本构建一个稳定可靠的监测节点?本文将带你从零开始&…...

强化学习基础(RL)笔记

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

Linux DTS配置避坑指南:以GC8034/OV系列Camera的I2C地址和引脚复用为例

Linux设备树配置实战:从GC8034/OV系列Camera的I2C地址陷阱到引脚复用优化 当你在凌晨三点的实验室里盯着示波器上那条毫无波动的I2C信号线时,是否曾怀疑过人生?作为嵌入式Linux开发者,我们或多或少都经历过这种绝望——特别是当面…...

从“国王-男人+女人=女王”到推荐系统:Word2Vec的Skip-gram与CBOW模型,到底该怎么选?

从词向量到业务落地:Skip-gram与CBOW模型工程选型指南 当我们在电商平台搜索"机械键盘"时,推荐系统会自动提示"游戏鼠标";当我们在音乐APP收听周杰伦的歌曲时,系统会推荐类似风格的歌手——这些智能推荐背后&…...

NRF52840 USB CDC例程里那个1Hz定时器,到底该怎么用才不踩坑?

NRF52840 USB CDC例程中1Hz定时器的深度优化指南 从32768到精准定时:理解低频时钟的奥秘 第一次接触NRF52840的开发者往往会对例程中那个神秘的32768数值感到困惑。这个数字并非随意选取,而是与芯片内部的低频时钟源(LFCLK)直接相关。NRF52840默认使用32…...

从GCC切换到Clang:在Qt 5.12.9项目中体验更快的代码分析与静态检查

从GCC切换到Clang:在Qt 5.12.9项目中体验更快的代码分析与静态检查 当你的Qt项目逐渐膨胀到数万行代码时,是否经历过这样的场景:修改一个头文件后,IDE的代码补全需要等待5秒才能响应;或者明明存在潜在的类型转换风险&a…...

Qwen2.5-0.5B-Instruct环保监测:野外设备数据解析AI部署

Qwen2.5-0.5B-Instruct环保监测:野外设备数据解析AI部署 想象一下这个场景:你是一名环保工程师,负责监测一片偏远湿地的水质。你的设备每隔一小时就会通过卫星链路传回一串数据,里面包含了水温、pH值、溶解氧、浊度等十几个参数。…...

从‘小白人转圈’到丝滑移动:详解UE角色蓝图里4种方向向量的正确用法

从‘小白人转圈’到丝滑移动:详解UE角色蓝图里4种方向向量的正确用法 在虚幻引擎的角色开发中,方向向量的选择往往决定了角色行为的精准度与自然度。许多开发者都遇到过这样的场景:明明按照教程连接了移动输入节点,角色却开始原地…...

Xamarin跨平台开发实战:为仓储盘点APP集成东大PDA扫码模块

Xamarin跨平台开发实战:为仓储盘点APP集成东大PDA扫码模块 在仓储管理和物流盘点场景中,快速准确的条码扫描是提升工作效率的关键。传统手机摄像头扫码方案在工业级场景下往往力不从心——扫描速度慢、对焦困难、弱光环境表现差等问题频出。而专为工业环…...

支付宝沙箱验签踩坑记:Hutool JSONObject格式化参数设置不当引发的invalid-signature

支付宝沙箱验签失败深度解析:Hutool JSON格式化参数引发的隐形陷阱 当你在Java项目中集成支付宝支付功能时,是否遇到过这样的场景:本地测试一切正常,但一旦接入沙箱环境就频繁报错"invalid-signature"?这个问…...

从调频信号(Chirp)到故障诊断:手把手教你用MATLAB玩转瞬时频率分析

从调频信号到故障诊断:MATLAB瞬时频率分析实战指南 轴承发出异常声响的第三天,王工在车间控制室里盯着屏幕上一段看似普通的振动波形皱起了眉头。传统频谱分析显示没有明显异常,但设备运行时那种微妙的"咔嗒"声始终挥之不去。这时&…...

Windows/Mac/Linux三平台通用!EISeg图像标注工具保姆级安装教程(附模型下载)

Windows/Mac/Linux三平台通用!EISeg图像标注工具保姆级安装教程(附模型下载) 在计算机视觉项目的开发流程中,高质量的数据标注往往是决定模型性能上限的关键因素。EISeg作为PaddlePaddle生态中的交互式图像分割标注工具&#xff0…...

JDK26 G1ZGC 双引擎升级:高并发应用吞吐量暴涨 真相

很多开发者对GC的认知还停留在"调参玄学"阶段,认为GC优化就是反复调整几个参数碰运气。但JDK26的GC改进完全打破了这个认知,它不是简单的参数微调,而是从算法设计、内存布局、并发执行到JIT协同的全方位重构。一、JDK26 GC演进的核…...