# 概述 优质的容器镜像应体积小、启动快、安全可控。本文提供工程化构建清单与已验证的安全策略,确保在生产环境可复现与审计。 # 构建优化(已验证) - 多阶段构建:编译与运行分离,最终镜像仅包含运行时文件。 - 基础镜像:优先使用 `alpine` 或 `distroless`(无包管理器、攻击面小)。 - 层缓存:稳定的 `COPY` 顺序与 `.dockerignore`;避免频繁失效。 - 可复现:固定 `ARG`/版本号与 `--platform`;避免 `latest`。 # 安全实践 - 非 root 用户运行: ```dockerfile FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build FROM gcr.io/distroless/nodejs20 WORKDIR /app COPY --from=build /app/dist ./dist USER 10001 EXPOSE 3000 CMD ["/app/dist/server.js"] ``` - SBOM 与扫描:生成并扫描依赖清单(如 `syft`, `grype`),在 CI 强制通过。 - 只读根文件系统:`readOnlyRootFilesystem: true`(K8s),限制写入面。 - 最小权限:仅暴露必要端口与文件;不包含编译器/包管理器。 # 体积与启动优化 - 清理构建产物与缓存目录; - 使用 `NODE_ENV=production` 或等效运行时优化; - 合理 `ENTRYPOINT`/`CMD`,避免 shell 包装浪费。 # 验证与度量 - 构建时间与层缓存命中率; - 镜像体积与启动时延; - 漏洞扫描报告在 CI 中阻断(高危级别)。 # 常见误区 - 使用 `latest` 造成不可复现; - 以 root 用户运行导致权限滥用风险; - 未配置 `.dockerignore` 导致层缓存失效与体积膨胀。 # 结语 通过工程化的分层与安全策略,镜像既可快速部署又具备供应链可审计性,适用于生产场景。

发表评论 取消回复