用途
Dockerfile Generator 是一个用于生成生产级 Dockerfile 的技能,覆盖安全、优化与最佳实践。它适用于从零创建 Dockerfile、容器化应用(Node.js、Python、Go、Java 或其他语言)、实现多阶段构建以优化体积、将现有 Dockerfile 转换为最佳实践、生成生产级容器配置,以及为安全与性能优化 Docker 构建。当用户请求“创建”“生成”“构建”或“编写”Dockerfile 时,或需要为微服务实现容器化、为 CI/CD 流水线设置容器构建时,可调用此技能。
不适用场景:验证现有 Dockerfile(应使用 dockerfile-validator)、构建或运行容器(使用 docker build/run 命令)、调试运行中的容器(使用 docker logs、docker exec)、管理 Docker 镜像或仓库。
主要能力
- 多阶段构建,优化镜像体积(减少 50-85%)
- 安全加固(非 root 用户、最小基础镜像、无密钥泄露)
- 层缓存优化,加快构建速度
- 语言专属模板(Node.js、Python、Go、Java)
- 自动生成 .dockerignore
- 与 dockerfile-validator 集成进行验证
- 迭代验证与错误修复(发现错误时至少迭代 1 次)
- 本地参考文件加文档查询回退链,用于框架专属模式
使用方式
该技能采用确定性执行模型,按顺序运行以下阶段,除非在最终输出中报告跳过原因,否则不得跳过任何阶段:
- 收集需求(语言、运行时版本、入口点、暴露端口、包管理器、健康检查端点)。
- 加载参考文件(优先本地参考文件;仅在本地参考不足时查阅外部文档)。
- 生成 Dockerfile 和 .dockerignore。
- 使用 dockerfile-validator 或回退本地工具进行验证。
- 迭代修复,直到满足停止条件。
- 发布最终产物及验证/审计报告。
第 5 阶段的停止条件:当验证错误为零且无未批准的警告时停止;最多迭代 3 次后停止,并针对未解决问题输出有意偏差报告。
参考路径映射:
- references/security_best_practices.md:非 root 用户、密钥处理、基础镜像加固、漏洞扫描。
- references/optimization_patterns.md:多阶段策略、缓存优化、层缩减、BuildKit 缓存挂载。
- references/language_specific_guides.md:语言/框架运行时与包管理器模式。
- references/multistage_builds.md:高级阶段拆分与产物复制模式。
生成工作流:
阶段 1:收集需求。了解需要容器化的内容并收集必要信息,包括应用详情(语言与版本、应用类型、框架、入口点)、依赖(包管理器、系统依赖、构建时与运行时依赖)、应用配置(端口、环境变量、配置文件、健康检查端点、卷挂载)、构建要求(构建命令、测试命令、编译需求、静态资源生成)、生产要求(镜像体积约束、安全要求、扩展需求、资源约束)。信息缺失或不明确时使用 AskUserQuestion 提问。
阶段 2:框架/库文档查询(如需要)。当用户提及特定框架、应用有复杂构建要求或需要框架专属优化指导时执行。研究过程遵循严格回退链:先读取本地参考文件(必需);本地参考不足时使用 Context7 文档查询(首选外部来源);Context7 不可用或缺少所需细节时使用网络搜索;外部查询不可用(离线/工具限制)时继续使用本地参考和语言模板,并在输出中明确说明假设,在最终报告中标记查询限制。仅提取可操作数据:推荐基础镜像与版本策略、构建优化技术、必需运行时环境变量、生产与开发差异、框架专属安全要求。
阶段 3:生成 Dockerfile。核心原则:多阶段构建(编译型语言必需,所有场景推荐);安全加固(必需,使用具体版本标签、非 root 用户、最小基础镜像、无硬编码密钥、扫描基础镜像漏洞);层优化(必需,按变更频率从低到高排序指令、先复制依赖文件再复制应用代码、用 && 合并相关 RUN 命令、同层清理包管理器缓存、有效利用构建缓存);生产就绪(必需,为服务添加 HEALTHCHECK、ENTRYPOINT/CMD 使用 exec 形式、WORKDIR 使用绝对路径、用 EXPOSE 记录端口)。
语言专属模板:提供 Node.js、Python、Go、Java 的多阶段 Dockerfile 示例。选择逻辑:Node.js 用于 JavaScript/TypeScript 应用;Python 用于 Python 应用(Web、API、脚本);Go 用于 Go 应用(适合最小镜像);Java 用于 Spring Boot、Quarkus 或其他 Java 框架;其他语言创建自定义 Dockerfile。始终包含:语法指令 # syntax=docker/dockerfile:1、多阶段构建、非 root 用户创建与使用、服务的 HEALTHCHECK(如适用)、正确的 WORKDIR 设置、EXPOSE 记录端口、清理包管理器缓存、CMD/ENTRYPOINT 使用 exec 形式。
阶段 4:生成 .dockerignore。始终随生成的 Dockerfile 一起创建 .dockerignore,以减少构建上下文并防止密钥泄露。提供标准模板,涵盖 Git、CI/CD、文档、Docker、环境变量、日志、依赖、IDE、测试、构建产物等类别,并根据语言定制(Node.js 添加 node_modules/ 等;Python 添加 pycache/ 等;Go 添加 vendor/ 等;Java 添加 target/ 等)。
阶段 5:使用 dockerfile-validator 验证。生成后必须始终运行验证。首选路径:调用 dockerfile-validator,按严重程度(error、warning、info)捕获发现,优先处理安全与可复现性问题。回退路径:尝试本地验证脚本 bash ../dockerfile-validator/scripts/dockerfile-validate.sh Dockerfile;若不可用,直接运行 hadolint Dockerfile 和 checkov -f Dockerfile --framework dockerfile;若一个或多个工具不可用,继续生成并在最终报告中报告每个跳过的检查。预期验证阶段:[1/4] 语法验证(hadolint)、[2/4] 安全扫描(Checkov)、[3/4] 最佳实践验证、[4/4] 优化分析。
阶段 6:验证-迭代循环。循环规则:至少运行一次验证;若存在任何错误,应用修复并重新运行验证;持续直到无错误残留或迭代次数达到 3;对于警告,要么修复,要么标记为有意偏差并说明理由;绝不静默抑制发现。迭代日志格式需记录迭代次数、使用的命令/路径、错误数、警告数、应用的修复、结果。常见修复包括:为基础镜像添加版本标签、在 CMD/ENTRYPOINT 前添加 USER 指令、为服务添加 HEALTHCHECK、在安全的情况下合并 RUN 命令、同层清理包缓存、将 ADD 替换为 COPY。
适用场景
- 从零创建 Dockerfile
- 容器化 Node.js、Python、Go、Java 或其他语言应用
- 实现多阶段构建以优化体积
- 将现有 Dockerfile 转换为最佳实践
- 生成生产级容器配置
- 为安全与性能优化 Docker 构建
- 为微服务实现容器化
- 为 CI/CD 流水线设置容器构建
限制
- 不用于验证现有 Dockerfile(应使用 dockerfile-validator)
- 不用于构建或运行容器(应使用 docker build/run 命令)
- 不用于调试运行中的容器(应使用 docker logs、docker exec)
- 不用于管理 Docker 镜像或仓库
- 外部文档查询不可用时,仅能依赖本地参考和语言模板,并需明确说明假设
- 验证工具不可用时,部分检查会被跳过并在报告中说明
- 迭代修复最多 3 次,未解决问题会以有意偏差报告形式输出