SuperAPI AI 工具集

dockerfile-validator

部署与运维

查看项目

更新于 10-13 21:31

技能介绍

用途

Dockerfile Validator 用于对已有的 Dockerfile 进行校验、lint、审计与安全扫描,帮助在 CI/CD 或生产部署前发现并加固问题。适用请求包括“验证这个 Dockerfile”“lint/检查我的 Dockerfile”“安全扫描 Dockerfile”“优化 Docker 镜像大小/构建时间”“合并前审查 Dockerfile”“查找 Dockerfile.prod/Dockerfile.dev 中的问题”。

主要能力

提供确定性的执行流程,包括语法与 lint 校验、安全与密钥检查、最佳实践与性能审查,以及面向 CI/CD 或生产环境的 Dockerfile 加固。发现的问题按标准严重模型分类:

  • Critical:硬编码密钥/凭据;在高风险上下文中显式以 root 运行时;高影响安全策略失败。
  • High:容器加固相关的 Checkov 失败;可能导致不安全或不可靠构建的 hadolint 错误;缺失或不安全的运行时用户姿态(USER)。
  • Medium::latest 镜像标签、缺失固定版本、缓存清理遗漏;构建缓存低效与分层安装反模式。
  • Low:风格/信息性指引与非阻塞优化建议。

使用方式

执行流程按顺序进行,除有明确回退分支外不得跳过:

  1. 预检与路径设置:以仓库根为工作目录,例如:
cd /path/to/repo
SKILL_DIR="devops-skills-plugin/skills/dockerfile-validator"
TARGET_DOCKERFILE="Dockerfile"   # replace when user provides a path
test -f "$SKILL_DIR/scripts/dockerfile-validate.sh"
test -f "$TARGET_DOCKERFILE"

任一检查失败即停止并报告缺失的具体路径。

  1. 显式读取目标 Dockerfile:
sed -n '1,220p' "$TARGET_DOCKERFILE"

长文件可继续:

sed -n '220,440p' "$TARGET_DOCKERFILE"
  1. 运行校验脚本:
bash "$SKILL_DIR/scripts/dockerfile-validate.sh" "$TARGET_DOCKERFILE"

可选捕获输出:

bash "$SKILL_DIR/scripts/dockerfile-validate.sh" "$TARGET_DOCKERFILE" | tee /tmp/dockerfile-validator.out
  1. 按严重程度分类发现。

  2. 无问题快速通道:若脚本报告总体通过、无安全失败、无需要用户处理的错误/警告,则返回简短通过摘要,不打开参考文件,不生成修复差异。

  3. 仅在存在发现时按问题类别加载参考文件:

  • 密钥、root 用户、暴露敏感端口、加固缺口 → references/security_checklist.md
  • 镜像大小、层数、多阶段机会、缓存效率、.dockerignore 缺口 → references/optimization_guide.md
  • 标签固定、指令使用、COPY vs ADD、WORKDIR/CMD/ENTRYPOINT 约定 → references/docker_best_practices.md

读取示例:

sed -n '1,220p' "$SKILL_DIR/references/security_checklist.md"
sed -n '1,220p' "$SKILL_DIR/references/optimization_guide.md"
sed -n '1,220p' "$SKILL_DIR/references/docker_best_practices.md"

定向提取示例:

rg -n "USER|secrets|EXPOSE|HEALTHCHECK" "$SKILL_DIR/references/security_checklist.md"
rg -n "multi-stage|cache|layer|dockerignore" "$SKILL_DIR/references/optimization_guide.md"
rg -n "FROM|COPY|ADD|WORKDIR|CMD|ENTRYPOINT|latest" "$SKILL_DIR/references/docker_best_practices.md"
  1. 生成标准报告,模板包含:目标路径、命令、总体结果(PASS | FAIL | PARTIAL (fallback))、Critical、High、Medium、Low、Recommended Fixes、References Used、Fallbacks Used。

  2. 询问是否应用修复;若用户同意,则修补 Dockerfile 并重新运行校验。

常用命令:

cd /path/to/repo
bash devops-skills-plugin/skills/dockerfile-validator/scripts/dockerfile-validate.sh Dockerfile
cd /path/to/repo
bash devops-skills-plugin/skills/dockerfile-validator/scripts/dockerfile-validate.sh Dockerfile.prod

校验示例文件:

cd /path/to/repo/devops-skills-plugin/skills/dockerfile-validator
bash scripts/dockerfile-validate.sh examples/good-example.Dockerfile
bash scripts/dockerfile-validate.sh examples/security-issues.Dockerfile

回归检查(CI 入口):

cd /path/to/repo
bash devops-skills-plugin/skills/dockerfile-validator/scripts/test_validate.sh

强制 ShellCheck 的严格模式:

STRICT_SHELLCHECK=true bash devops-skills-plugin/skills/dockerfile-validator/scripts/test_validate.sh

回退行为

  • Fallback A:脚本因工具安装失败退出(如缺少 Python、包安装被阻止或受限环境)。报告主要失败原因,并执行手动最低检查。若 Docker 可用:
DOCKERFILE_DIR="$(dirname "$TARGET_DOCKERFILE")"
docker build --no-cache -f "$TARGET_DOCKERFILE" "$DOCKERFILE_DIR"
grep -nEi "^[[:space:]]*FROM[[:space:]]+.*:latest" "$TARGET_DOCKERFILE" || true
grep -nEi "^[[:space:]]*(ENV|ARG)[[:space:]].*(password|secret|token|api[_-]?key)[[:space:]]*=" "$TARGET_DOCKERFILE" || true
grep -nEi "^[[:space:]]*USER[[:space:]]+(root|0(:0)?)$" "$TARGET_DOCKERFILE" || true
grep -nEi "^[[:space:]]*HEALTHCHECK[[:space:]]+" "$TARGET_DOCKERFILE" || true

输出标记为 PARTIAL,并清楚标注跳过的检查。

  • Fallback B:hadolint 不可用但 Docker 可用:
docker run --rm -i hadolint/hadolint < "$TARGET_DOCKERFILE"
  • Fallback C:无 Docker、无 hadolint/checkov:仅运行基于正则的手动检查(Fallback A 第 2 步),标记为 PARTIAL,并说明跳过了哪些扫描器。

适用场景与限制

适用:语法与 lint 校验、安全与密钥检查、最佳实践与性能审查、CI/CD 或生产前的 Dockerfile 加固、合并前审查、查找指定 Dockerfile 中的问题。

不适用:从零生成新的 Dockerfile(应使用 dockerfile-generator)、运行容器、调试运行时行为或镜像仓库操作。

渐进式披露规则:始终先读取目标 Dockerfile;除非发现需要,不读取任何参考文件;只读与问题映射匹配的参考文件;除非出现新问题类别,不重复读取同一参考。

完成标准:触发条件匹配 Dockerfile 校验/lint/安全/优化请求;目标路径被显式验证;校验命令或明确回退已执行;发现按严重级别桶报告;参考使用与问题类别匹配并明确列出;无问题快速通道跳过不必要的参考读取;若应用修复,则重新运行校验并报告最终状态。

资源

  • 脚本:scripts/dockerfile-validate.sh
  • CI/回归入口:scripts/test_validate.sh
  • 安全参考:references/security_checklist.md
  • 优化参考:references/optimization_guide.md
  • 最佳实践参考:references/docker_best_practices.md
  • 示例:examples/good-example.Dockerfile、examples/bad-example.Dockerfile、examples/security-issues.Dockerfile、examples/python-optimized.Dockerfile、examples/golang-distroless.Dockerfile

费用、价格与具体平台支持范围暂未提供。