计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
implementing-container-image-minimal-base-with-distroless【效率与协作】通过在 Google distroless 基础镜像上构建应用镜像来减少容器攻击面,这些镜像仅包含应用运行时,没有 shell、包管理器或不必要的 OS 工具。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Google distroless 镜像仅包含应用程序及其运行时依赖项,不包含包管理器、shell 或标准 Linux 发行版中的其他程序。通过消除不必要的 OS 组件,distroless 镜像与 ubuntu 或 debian 等传统基础镜像相比,攻击面减少高达 95%。Kubernetes 本身、Knative 和 Tekton 等主要项目在生产中使用 distroless 镜像。截至 2025 年,Docker 也提供了 Hardened Images (DHI) 作为最小容器基础的开源替代方案。
| 镜像 | 使用场景 | 大小 |
|---|---|---|
gcr.io/distroless/static-debian12 | 静态编译的二进制文件(Go、Rust) | ~2MB |
gcr.io/distroless/base-debian12 | 需要 glibc 的动态链接二进制文件 | ~20MB |
gcr.io/distroless/cc-debian12 | 需要 libstdc++ 的 C/C++ 应用 | ~25MB |
gcr.io/distroless/java21-debian12 | Java 21 应用 | ~220MB |
gcr.io/distroless/python3-debian12 | Python 3 应用 | ~50MB |
gcr.io/distroless/nodejs22-debian12 | Node.js 22 应用 | ~130MB |
# 构建阶段
FROM golang:1.22-bookworm AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server
# 运行阶段 - 静态 distroless
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /server /server
USER nonroot:nonroot
ENTRYPOINT ["/server"]
# 构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# 运行阶段 - Java distroless
FROM gcr.io/distroless/java21-debian12:nonroot
COPY --from=builder /app/target/app.jar /app.jar
USER nonroot:nonroot
ENTRYPOINT ["java", "-jar", "/app.jar"]
# 构建阶段
FROM python:3.12-bookworm AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --target=/deps -r requirements.txt
COPY . .
# 运行阶段 - Python distroless
FROM gcr.io/distroless/python3-debian12:nonroot
WORKDIR /app
COPY --from=builder /deps /deps
COPY --from=builder /app /app
ENV PYTHONPATH=/deps
USER nonroot:nonroot
ENTRYPOINT ["python3", "/app/main.py"]
# 构建阶段
FROM node:22-bookworm AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
# 运行阶段 - Node distroless
FROM gcr.io/distroless/nodejs22-debian12:nonroot
WORKDIR /app
COPY --from=builder /app .
USER nonroot:nonroot
CMD ["server.js"]
| 组件 | Ubuntu | Alpine | Distroless |
|---|---|---|---|
| Shell(bash/sh) | 有 | 有 | 无 |
| 包管理器 | apt | apk | 无 |
| coreutils | 完整 | BusyBox | 无 |
| curl/wget | 有 | 有 | 无 |
| 用户管理 | 有 | 有 | 无 |
| 已知 CVE(典型) | 50-200+ | 5-20 | 0-5 |
| 镜像大小(基础) | ~77MB | ~7MB | ~2-20MB |
cat、ls、find、curl 可用于侦察:nonroot 标签以 UID 65534 运行由于 distroless 没有 shell,使用以下技术进行调试:
# 仅在非生产环境中使用 debug 变体
FROM gcr.io/distroless/base-debian12:debug
# 包含位于 /busybox/sh 的 busybox shell
# 进入 debug 变体
kubectl exec -it pod-name -- /busybox/sh
# 附加一个带完整工具的调试容器
kubectl debug -it pod-name --image=busybox:1.36 --target=app-container
# 不运行即可检查镜像层
crane export gcr.io/distroless/static-debian12 - | tar -tf - | head -50
# 分析镜像层
dive gcr.io/distroless/static-debian12
使用 Trivy 的典型漏洞对比:
# 扫描基于 Ubuntu 的镜像
trivy image myapp:ubuntu
# 结果: 47 个漏洞(3 严重, 12 高危)
# 扫描基于 Distroless 的镜像
trivy image myapp:distroless
# 结果: 2 个漏洞(0 严重, 0 高危)