<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675">
  <defs>
    <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
      <stop offset="0%" stop-color="#f7fbff"/>
      <stop offset="100%" stop-color="#eef4ff"/>
    </linearGradient>
    <style>
      .title{font:700 30px sans-serif;fill:#12315a}
      .label{font:600 22px sans-serif;fill:#163a63}
      .text{font:18px sans-serif;fill:#33506f}
      .box{fill:#ffffff;stroke:#6c8ebf;stroke-width:3;rx:18;ry:18}
      .arrow{stroke:#4c78a8;stroke-width:4;marker-end:url(#m)}
      .small{font:16px sans-serif;fill:#4a5f7a}
    </style>
    <marker id="m" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
      <path d="M0,0 L9,3 L0,6 Z" fill="#4c78a8"/>
    </marker>
  </defs>
  <rect width="1200" height="675" fill="url(#bg)"/>
  <text x="60" y="70" class="title">Dockerfile 构建层级与缓存命中流程</text>

  <rect x="60" y="120" width="250" height="95" class="box"/>
  <text x="85" y="160" class="label">基础镜像</text>
  <text x="85" y="190" class="text">固定版本、变化少</text>

  <rect x="330" y="120" width="250" height="95" class="box"/>
  <text x="355" y="160" class="label">依赖清单</text>
  <text x="355" y="190" class="text">go.mod / package-lock</text>

  <rect x="600" y="120" width="250" height="95" class="box"/>
  <text x="625" y="160" class="label">依赖安装</text>
  <text x="625" y="190" class="text">缓存复用价值最高</text>

  <rect x="870" y="120" width="270" height="95" class="box"/>
  <text x="895" y="160" class="label">应用源码</text>
  <text x="895" y="190" class="text">变化频繁、放在后面</text>

  <line x1="310" y1="167" x2="330" y2="167" class="arrow"/>
  <line x1="580" y1="167" x2="600" y2="167" class="arrow"/>
  <line x1="850" y1="167" x2="870" y2="167" class="arrow"/>

  <rect x="120" y="290" width="960" height="290" class="box"/>
  <text x="155" y="340" class="label">缓存命中逻辑</text>
  <text x="155" y="385" class="text">1. 前面层稳定时，后续构建可直接复用已生成的镜像层。</text>
  <text x="155" y="425" class="text">2. 先复制锁定文件，再安装依赖，可以避免源码改动导致依赖层反复失效。</text>
  <text x="155" y="465" class="text">3. 把高频变化内容放在后面，可以显著缩短日常迭代构建时间。</text>
  <text x="155" y="525" class="small">推荐做法：基础镜像 → 锁定文件 → 依赖安装 → 源码复制 → 编译输出</text>
</svg>