用途
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:风格/信息性指引与非阻塞优化建议。
使用方式
执行流程按顺序进行,除有明确回退分支外不得跳过:
- 预检与路径设置:以仓库根为工作目录,例如:
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"
任一检查失败即停止并报告缺失的具体路径。
- 显式读取目标 Dockerfile:
sed -n '1,220p' "$TARGET_DOCKERFILE"
长文件可继续:
sed -n '220,440p' "$TARGET_DOCKERFILE"
- 运行校验脚本:
bash "$SKILL_DIR/scripts/dockerfile-validate.sh" "$TARGET_DOCKERFILE"
可选捕获输出:
bash "$SKILL_DIR/scripts/dockerfile-validate.sh" "$TARGET_DOCKERFILE" | tee /tmp/dockerfile-validator.out
-
按严重程度分类发现。
-
无问题快速通道:若脚本报告总体通过、无安全失败、无需要用户处理的错误/警告,则返回简短通过摘要,不打开参考文件,不生成修复差异。
-
仅在存在发现时按问题类别加载参考文件:
- 密钥、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"
-
生成标准报告,模板包含:目标路径、命令、总体结果(PASS | FAIL | PARTIAL (fallback))、Critical、High、Medium、Low、Recommended Fixes、References Used、Fallbacks Used。
-
询问是否应用修复;若用户同意,则修补 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
费用、价格与具体平台支持范围暂未提供。