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

Dockerfile系列(二) 镜像分层与缓存-为什么你的构建这么慢

镜像分层与缓存为什么你的构建这么慢本文基于 Docker 24.x理解分层机制是写出高效 Dockerfile 的关键。场景引入改一行代码构建五分钟上篇咱们写了个能跑的 Dockerfile但用着用着发现问题了我就改了个res.send()里的字符串重新构建时居然又从头npm install了一遍看着终端里慢悠悠下载依赖的进度条我开始怀疑人生…其实啊这不是 Docker 慢是你没搞懂它的分层缓存机制。今天咱们就把这个汉堡分层原理扒清楚。核心原理UnionFS 与镜像分层镜像到底是什么结构Docker 镜像不是一个大文件而是像汉堡一样一层一层叠起来的最上层可读可写你的应用代码 ↓ 中间层npm install 安装的依赖 ↓ 中间层package.json 拷贝 ↓ 最底层基础镜像node:18-alpine 操作系统每一层都是只读的容器运行时在最上面加一层可写层。这种设计叫UnionFS联合文件系统。类比汉堡店的预制菜想象你去快餐店买汉堡基础镜像面包底工厂批量做好的大家一样RUN 安装依赖肉饼厨房提前煎好的换的人不多COPY 代码生菜番茄每次可能不一样容器运行你加的黄芥末最上面这层每人自定义关键是如果某一层没变就直接从冰箱里拿预制好的不用重做。这就是缓存的本质。缓存规则什么时候命中什么时候失效Docker 构建时从上往下逐层检查某一层的内容没变→ 直接用缓存跳过执行某一层变了→ 这一层及之后的所有层全部重新构建致命陷阱COPY . .的位置看个反例FROM node:18-alpine WORKDIR /app # ❌ 错误先把所有代码拷进去 COPY . . # 完蛋只要改任何代码这一层就变了 RUN npm install # 缓存失效重新安装 EXPOSE 3000 CMD [npm, start]因为COPY . .把package.json、app.js、README.md全拷进去了你改个注释这一层就变了后面的npm install必须重做。正确姿势让不常变的先拷贝FROM node:18-alpine WORKDIR /app # ✅ 正确先单独拷 package.json不常变 COPY package*.json ./ RUN npm install # 依赖没变直接命中缓存 # 经常变的代码放后面 COPY . . EXPOSE 3000 CMD [npm, start]这样只有package.json或package-lock.json变了才重新npm install。改业务代码缓存稳稳命中。实战验证用docker history看分层构建完成后看看镜像的分层结构dockerhistorymy-first-app输出大概长这样IMAGE CREATED CREATED BY SIZE abc123 2 min ago CMD [npm start] 0B missing 2 min ago EXPOSE map[3000/tcp:{}] 0B missing 2 min ago COPY . . # buildkit 12.3kB missing 2 min ago RUN /bin/sh -c npm install # buildkit 45.6MB missing 2 min ago COPY package*.json ./ # buildkit 2.1kB missing 2 min ago WORKDIR /app 0B missing 2 min ago /bin/sh -c #(nop) CMD [node] 0B每一行就是一层SIZE 表示这层新增的数据量。看到没npm install那层占了 45MB这就是我们要极力避免重复执行的原因。进阶技巧强制不用缓存有时候你想彻底重新构建比如基础镜像更新了# 加 --no-cache从头来dockerbuild --no-cache-tmy-app.或者只让某一层失效在 Dockerfile 里加个小技巧——# 通过 ARG 传入时间戳让这层总是变 ARG CACHEBUST1 RUN npm install构建时换一下参数缓存就失效了dockerbuild --build-argCACHEBUST$(date%s)-tmy-app.更多缓存优化技巧1. 合并 RUN 指令减少层数每条RUN创建一层。如果多个命令有依赖关系可以合并# 之前3 层 RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y vim # 优化1 层顺便清理缓存 RUN apt-get update \ apt-get install -y curl vim \ rm -rf /var/lib/apt/lists/*最后那个清理很重要不然apt的缓存会永久留在镜像里占空间。2. 利用 BuildKit 的缓存挂载Docker 新版支持更高级的缓存需要启用 BuildKit# syntaxdocker/dockerfile:1 FROM node:18-alpine WORKDIR /app COPY package*.json ./ # 把 npm 缓存挂在主机上跨构建复用 RUN --mounttypecache,target/root/.npm \ npm install COPY . . CMD [npm, start]这样即使package.json变了npm 的下载缓存还在不用重新从网络拉。一句话总结Dockerfile 的缓存像叠汉堡一层变了上面全重做。把不常变的指令依赖安装放前面常变的业务代码放后面构建速度能快几倍。

相关文章:

Dockerfile系列(二) 镜像分层与缓存-为什么你的构建这么慢

镜像分层与缓存:为什么你的构建这么慢?本文基于 Docker 24.x,理解分层机制是写出高效 Dockerfile 的关键。场景引入:改一行代码,构建五分钟? 上篇咱们写了个能跑的 Dockerfile,但用着用着发现问…...

《Windows Internals》10.2.11 学习笔记:虚拟服务账户(The Virtual Service Account)——为什么 Windows 服务不再只依赖普通账号?

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

低算力适配!面向采摘机器人的改进 YOLOv8 实现遮挡花椒精准识别

点击蓝字关注我们关注并星标从此不迷路计算机视觉研究院公众号ID|计算机视觉研究院学习群|扫码在主页获取加入方式https://pmc.ncbi.nlm.nih.gov/articles/PMC12894851/pdf/41598_2026_Article_36671.pdf计算机视觉研究院专栏Column of Computer Vision …...

C++ 类设计实践(一):自定义 String 类与顺序栈

引言在学完 C 的类、构造函数、析构函数、拷贝控制、运算符重载、模板等核心知识后,动手设计一个完整的类是最好的巩固方式。今天,我将通过两个实践项目来检验这些知识的掌握程度:自定义 String 类:模拟标准库 std::string 的核心…...

Python自动化仿真终极指南:用MPh脚本化你的COMSOL多物理场工作流

Python自动化仿真终极指南:用MPh脚本化你的COMSOL多物理场工作流 【免费下载链接】MPh Pythonic scripting interface for Comsol Multiphysics 项目地址: https://gitcode.com/gh_mirrors/mp/MPh 还在为重复的COMSOL仿真操作感到疲惫吗?&#x1…...

终极指南:Agent创业机会,从垂直领域切入

终极指南:Agent创业机会,从垂直领域切入 引言 痛点引入:AI Agent浪潮下,普通创业者/技术人该怎么抢滩? 过去两年的AI技术发展,完全是“天翻地覆”级别的——ChatGPT的诞生把通用大语言模型(LLM&…...

基于LangGraph与多智能体协作的AI内容生成系统实战解析

1. 项目概述:一个基于多智能体协作的AI内容生成系统如果你也像我一样,经常被各种报告、方案、甚至小说创作的需求搞得焦头烂额,那么今天分享的这个项目,可能会成为你的“生产力倍增器”。我最近深度体验并拆解了一个名为“XunLong…...

LinkSwift网盘直链下载助手:免费解锁八大网盘高速下载的终极指南

LinkSwift网盘直链下载助手:免费解锁八大网盘高速下载的终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

Amlogic S9xxx Armbian历史版本获取指南:解决新内核不兼容的实战方案

Amlogic S9xxx Armbian历史版本获取指南:解决新内核不兼容的实战方案 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s…...

3分钟掌握RPG Maker解密工具:轻松提取游戏资源

3分钟掌握RPG Maker解密工具:轻松提取游戏资源 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMaker…...

5分钟快速上手StarRailCopilot:崩坏星穹铁道智能自动化助手

5分钟快速上手StarRailCopilot:崩坏星穹铁道智能自动化助手 【免费下载链接】StarRailCopilot 崩坏:星穹铁道脚本 | Honkai: Star Rail auto bot (简体中文/繁體中文/English/Espaol) 项目地址: https://gitcode.com/gh_mirrors/st/StarRailCopilot …...

我从前熬夜整理会议纪要熬到头秃,后悔没早用!2026自动生成会议纪要真的太香了

上个月刚经历完因为会议纪要出错扣半个月绩效的社死现场,作为每周要泡在四五个会里的内容创作者,我前两年光是整理会议、访谈录音,每周就能耗掉我10小时以上,熬到发缝变宽都没解决问题。测了不下10款自动纪要工具,我可…...

如何在现代显示器上完美体验《植物大战僵尸》?PvZWidescreen宽屏模组彻底告别黑边困扰

如何在现代显示器上完美体验《植物大战僵尸》?PvZWidescreen宽屏模组彻底告别黑边困扰 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 还在为经典游戏《植物大战僵尸》在…...

Rust 所有权系统:借用检查器与生命周期

# Rust异步编程:Tokio运行时深度解析> **版本说明**:本文基于 Tokio 1.x 版本和 Rust 1.75 编写,所有代码示例均经过测试验证。## 📚 引言异步编程是现代高性能服务的基石,而 Tokio 作为 Rust 生态中最成熟的异步运…...

别再只用来校验文件了!聊聊哈希值在Python、Java和数据库里的5个实战骚操作

哈希值的五大高阶应用:从数据去重到分布式系统的实战技巧 开发者在日常工作中经常使用哈希值进行简单的数据校验,但它的潜力远不止于此。当我们将哈希算法与特定编程语言特性、数据库优化和系统设计相结合时,能解锁许多令人惊喜的高级用法。…...

NVIDIA Grace CPU架构解析与数据中心能效优化实践

1. NVIDIA Grace CPU家族:数据中心效率革命的核心引擎当全球数据量以每年23%的速度增长,传统CPU架构却陷入性能提升瓶颈时,数据中心的能效比成为决定未来计算能力的关键指标。作为从业十五年的数据中心架构师,我见证过无数次硬件迭…...

SpringBoot配置文件加密进阶:手把手教你自定义Jasypt加密算法和前缀后缀(告别默认ENC)

SpringBoot配置文件加密进阶:手把手教你自定义Jasypt加密算法和前缀后缀(告别默认ENC) 在企业级应用开发中,配置文件的安全性往往被忽视,尤其是数据库连接信息、API密钥等敏感数据。虽然Jasypt提供了开箱即用的ENC()加…...

Edgi-Talk开发套件:边缘AI全栈解决方案解析

1. Edgi-Talk开发套件核心解析这款由英飞凌和RT-Thread联合设计的开发板,本质上是一个面向边缘AI场景的全栈解决方案。PSOC Edge E84 SoC的双核架构设计非常有意思——400MHz的Cortex-M55主攻AI运算,搭配200MHz的Cortex-M33处理常规任务,这种…...

如何自动同步SQL异构表数据_利用触发器实现实时数据复制

不能,触发器仅支持同库同结构表的同步;跨库或异构场景需用binlogDebeziumKafka自定义消费者方案。触发器能自动同步异构表吗?不能,别硬套触发器本身不解决异构问题——它只在同库同结构的表上可靠运行。INSERT、UPDATE、DELETE 触…...

长沙心理医院暖心指南+真实案例分享

随着社会节奏加快,心理健康问题逐渐成为影响个人生活质量与社会和谐的重要因素。在长沙,作为中部核心城市,心理疾病就诊需求持续攀升,但与此同时,患者在就医过程中仍面临诸多挑战。据相关统计显示,长沙市居…...

青少年心理咨询指南:真实案例分享与暖心复盘

行业痛点分析当前长沙心理领域面临多重技术挑战。一方面,青少年心理问题呈现高发趋势,但社会对精神心理疾病仍存在认知偏差,导致病耻感普遍,许多学生因“怕被贴标签”而拒绝求助。另一方面,三甲医院心理科号源紧张&…...

终极解决方案:3分钟搞定Windows与iPhone网络共享驱动安装

终极解决方案:3分钟搞定Windows与iPhone网络共享驱动安装 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_…...

解锁音乐自由:ncmdumpGUI带你轻松解密网易云NCM格式

解锁音乐自由:ncmdumpGUI带你轻松解密网易云NCM格式 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#x…...

如何为魔兽争霸3解锁180fps帧率限制:WarcraftHelper完整配置指南

如何为魔兽争霸3解锁180fps帧率限制:WarcraftHelper完整配置指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典RTS游戏…...

VS Code Copilot Next 配置避坑黄金三角:权限粒度 × 语言服务器绑定 × Workspace Trust 状态(实测137次失败回溯)

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置避坑指南 VS Code Copilot Next(v1.120)引入了基于 Workspace Trust 和 Language Server Protocol 的深度集成机制,但默认配…...

远程容器开发效率提升300%:VS Code Dev Containers 7个被90%开发者忽略的优化开关

更多请点击: https://intelliparadigm.com 第一章:Dev Containers 效率瓶颈的真相诊断 Dev Containers 本应简化环境一致性与协作开发,但实践中常遭遇构建缓慢、容器启动卡顿、VS Code 扩展加载失败等隐性性能衰减。这些现象并非源于设计缺陷…...

PTA天梯赛L2-012通关秘籍:手把手教你用C++搞定小顶堆的四种关系判断

PTA天梯赛L2-012通关秘籍:手把手教你用C搞定小顶堆的四种关系判断 在算法竞赛的战场上,堆结构就像瑞士军刀般不可或缺。今天我们要破解的PTA天梯赛L2-012题目,正是考察小顶堆构建与关系判断的经典案例。这道题看似简单,却暗藏多个…...

云原生智能流量代理trae-agent:动态路由、负载均衡与熔断限流实战

1. 项目概述:一个面向云原生时代的智能流量代理最近在梳理团队内部的微服务治理工具链时,又仔细研究了一下bytedance/trae-agent这个项目。它不是一个简单的反向代理,而是一个设计理念相当超前的“智能流量代理”。简单来说,它就像…...

2026年怎么集成OpenClaw/Hermes Agent?零基础部署及token Plan配置步骤

2026年怎么集成OpenClaw/Hermes Agent?零基础部署及token Plan配置步骤。OpenClaw(前身为Clawdbot/Moltbot)作为开源、本地优先的AI助理框架,凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力,成为个人办…...

WASM边缘服务上线倒计时:Docker Compose v2.22起支持wasm32-wasi,但92%开发者还没启用这个flag

更多请点击: https://intelliparadigm.com 第一章:Docker WASM 边缘计算部署指南 如何实现快速接入 WebAssembly(WASM)正成为边缘计算场景中轻量、安全、跨平台执行逻辑的关键载体,而 Docker 官方自 2023 年起通过 do…...