从 distroless 到 scratch:基础镜像的极简选择

举报
yd_264617019 发表于 2026/10/21 11:20:05 2026/10/21
【摘要】 镜像安全的尽头是基础镜像里到底有什么。distroless和scratch代表两个方向的极简:前者是Google维护的只含运行时必需库的镜像族,后者干脆是空镜像。先说适用性。Go静态编译的二进制最适合scratch:CGO_ENABLED=0之后产物零依赖,镜像就是二进制本身,10M上下。Java应用选distroless的java变体,里面只有JRE和CA证书,没有shell、没有包管理器...

镜像安全的尽头是基础镜像里到底有什么。distroless 和 scratch 代表两个方向的极简:前者是 Google 维护的只含运行时必需库的镜像族,后者干脆是空镜像。

先说适用性。Go 静态编译的二进制最适合 scratch:CGO_ENABLED=0 之后产物零依赖,镜像就是二进制本身,10M 上下。Java 应用选 distroless 的 java 变体,里面只有 JRE 和 CA 证书,没有 shell、没有包管理器。Python 的极简替代品还在演进,实践中用 slim 已经够用。

没有 shell 的代价要提前想清楚。docker exec sh 进不去,排障手段变成:kubectl debug 附加临时容器进同一 Pod 共享网络命名空间,或者把日志和诊断端点做扎实,让排障不需要登进容器。我们改造时给每个服务补齐了诊断用的 HTTP 端点,算是因祸得福。

安全收益直接体现在扫描报告上:原来 ubuntu 基础镜像常年挂着 40 多个 CVE,distroless 后降到个位数,且大多是低危。体积从 180M 到 22M 的那批 Go 服务,拉取速度也明显变快,冷启动一并受益。

落地节奏建议灰度:新服务直接上,存量服务在基础镜像升级窗口一起换,换之前在预发跑一轮完整回归,重点验证动态链接库和 CA 证书依赖。

还有一个细节:非 root 用户、只读根文件系统这些安全上下文和极简镜像是绝配,一起上收益最大。基础镜像越薄,能出安全问题的地方越少。

补充一个排障替代方案:临时容器里塞个轻量调试镜像,通过进程共享的方式进入目标容器命名空间,官方工具一条命令搞定。这个方案普及后,坚持用完整镜像的团队也接受了极简方案,毕竟调试需求有了正路,就不必为小概率场景背着大镜像。

极简镜像的另一个隐性收益是启动速度:批量扩容几百个副本时,三十兆和两百兆的镜像拉取时间差会被并发放大,扩容完成时间能差出一分钟以上,对弹性场景这就是竞争力。我们把镜像大小做进了服务资产信息,超过阈值的会出现在架构周会的待优化清单里,配一条自动卡点防止回弹,治理成果要靠机制守住。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。