构建与制品管理58 条

distroless 镜像

只含运行时与应用依赖、没有包管理器与 shell:缩小攻击面与体积,代价是排查手段受限(需借助旁路调试)。

CI/CD 与发布速查开发更新于 2026-10-13

distroless 镜像是什么

distroless 镜像是只含运行时与应用依赖、没有包管理器与 shell 的容器镜像:攻击面与体积都被压到最小。Google 维护的 distroless 基础镜像覆盖 static、base 与语言专用变体。它的代价是排查手段受限:无法进容器交互,排障依赖日志、指标与临时调试镜像。适合编译型语言与自带运行时的服务。

基本信息

适用编译型语言(Go/Rust/Java)静态或自带运行时的服务
变体static、base、语言专用与调试变体(含忙碌工具箱)
权衡无法进入容器排查,依赖日志、指标与临时调试镜像
平台支持 OCI 镜像的容器运行时与 Kubernetes
构建多阶段构建把产物拷入无发行版终态
日志应用写标准输出,由平台采集

典型使用场景

  • 生产瘦身:基础镜像从完整发行版换成最小集合
  • 攻击面收敛:没有 shell 与包管理器,入侵后的操作空间小
  • 漏洞扫描降噪:已知漏洞数量显著减少
  • Java 服务:语言变体直接运行产物,无需自装运行时
  • 排障配合:短时切调试变体或旁路工具定位问题
  • 多阶段构建:编译阶段用完整镜像,终态只拷贝产物与运行时
  • 日志排障:应用把日志写标准输出,依赖外部采集而非登录容器

用法示例

用法示例
FROM gcr.io/distroless/java21-debian12
COPY app.jar /app.jar
USER nonroot  # 以非 root 运行
ENTRYPOINT ["java", "-jar", "/app.jar"]
# 排查时短时切到带工具箱的调试变体,或挂载临时侧车

变体选择

变体内含适用
static证书与基础文件完全静态的二进制
base常见底层库动态链接的程序
语言变体对应运行时Java、Node 等服务
调试变体含诊断工具短时排查专用
生产用无调试变体、排障时切调试变体或临时侧车,兼顾安全与可运维。
健康检查用平台探针而不是容器内命令:没有 shell 就不要设计依赖命令行的检查方式。
容器内只跑单一主进程:信号由应用直接处理,避免依赖入口脚本转发。

易错点

  • 应用内置健康检查脚本依赖 shell:distroless 里没有,检查逻辑移到外部探针
  • 用 distroless 却把敏感文件拷进去:镜像小不等于安全,逐项审计内容
  • 调试工具常驻最终镜像:临时加完忘记移除,瘦身白做
  • 动态链接程序配了静态变体:运行时找不到链接库直接崩溃,按链接依赖选择变体

数据来源与参考

  • GoogleContainerTools distroless 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌