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 就不要设计依赖命令行的检查方式。
容器内只跑单一主进程:信号由应用直接处理,避免依赖入口脚本转发。