mcpField
D
dockerfile-skill

dockerfile-skill

github.com/zjy365云与 DevOps68 次安装
代码仓库

关于 dockerfile-skill

dockerfile-skill 是用于分析项目并生成 Dockerfile 的技能,面向需要容器化应用的开发者。它涵盖构建修复与运行时验证,重点检查迁移、数据库和应用健康状态。

主要功能

  1. 01分析项目结构与构建复杂度
  2. 02生成 Dockerfile 和配套配置
  3. 03识别迁移并配置执行
  4. 04构建失败后迭代修复
  5. 05验证容器启动与应用健康
  6. 06检查数据库迁移和表

适用场景

  1. 01为单体仓库生成 Docker 构建配置
  2. 02为应用配置数据库迁移执行
  3. 03排查构建错误并验证容器运行
  4. 04检查容器化应用的数据库和 HTTP 状态

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/zjy365/sealos-skills --skill dockerfile-skill

安装后在 Claude Code 中输入/dockerfile-skill确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

examples/
output-format.md
knowledge/
best-practices.md
error-patterns.md
lessons-learned.md
monorepo-cli-patterns.md
system-deps.md
modules/
analyze.md
build-fix.md
generate.md
scripts/
validate-dockerfile.mjs
templates/
golang.dockerfile
java-springboot.dockerfile
nodejs-express.dockerfile
nodejs-nextjs-bun.dockerfile
nodejs-nextjs.dockerfile
nodejs-nuxt.dockerfile
python-django.dockerfile
python-fastapi.dockerfile
rust.dockerfile
templates/assets/
docker-entrypoint-drizzle.sh
docker-entrypoint-plain.sh
docker-entrypoint-prisma.sh
docker-entrypoint-typeorm.sh

详细介绍

Dockerfile 生成技能

概述

此技能通过一个 4 阶段流程生成可用于生产环境的 Dockerfile:

  1. 深入分析 —— 了解项目结构、工作区、迁移和构建复杂度
  2. 生成 —— 创建 Dockerfile,并处理迁移和优化构建
  3. 构建并修复 —— 通过实际构建进行验证,迭代修复错误
  4. 运行时验证 —— 确认迁移已运行、应用正常工作且数据库已填充

主要功能

  • 工作区/Monorepo 支持:pnpm 工作区、Turborepo、npm 工作区
  • 自定义 CLI 检测:自动检测自定义构建 CLI(turbo、nx、lerna、rush 或项目专用 CLI),并使用正确语法
  • Git 哈希绕过:检测并处理需要 git commit 哈希(GITHUB_SHA)的项目
  • 构建时环境变量:自动检测 Next.js SSG 并添加占位符
  • 错误模式数据库:包含 40 多种已知错误模式及自动修复方法
  • 智能 .dockerignore:避免排除工作区必需文件和 CLI 配置依赖项
  • 自定义入口点:支持自定义服务启动器
  • 迁移检测:自动检测 ORM 和迁移,并处理独立模式
  • 构建优化:跳过耗费资源的 CI 任务(lint/类型检查),避免内存不足
  • 运行时验证:确认迁移已运行、数据库已填充且应用正常工作
  • 原生模块支持:自动检测 Rust/NAPI-RS 模块,支持多架构构建
  • 静态资源映射:检测后端预期的静态资源路径,并映射前端输出
  • 外部服务:自动检测 PostgreSQL、Redis、MinIO、ManticoreSearch 依赖项
  • 无需人工交互:自动生成所有配置文件,包括密钥

用法

/dockerfile          # Analyze current directory
/dockerfile <github-url>    # Clone and analyze GitHub repo
/dockerfile <path>       # Analyze specific path

快速开始

调用后,务必按以下顺序执行:

  1. 阅读并执行 modules/analyze.md
  2. 阅读并执行 modules/generate.md
  3. 阅读并执行 modules/build-fix.md

工作流

阶段 1:深入分析项目

加载并执行:modules/analyze.md

输出:结构化项目元数据,包括:

  • 语言/框架/包管理器
  • 构建命令/运行命令/端口
  • 外部依赖项(DB/Redis/S3)
  • 系统库要求
  • 迁移系统检测(ORM、迁移数量、执行方式)
  • 构建复杂度分析(高负载操作、内存风险)
  • 复杂度级别(L1/L2/L3)
阶段 2:生成 Dockerfile

加载并执行:modules/generate.md

输入:阶段 1 的分析结果 输出:

  • Dockerfile(处理迁移并优化构建)
  • .dockerignore(适配工作区)
  • docker-compose.yml(如需外部服务)
  • .env.docker.local(自动生成并包含测试密钥)
  • docker-entrypoint.sh(执行迁移)
  • DOCKER.md(完整部署指南)
  • 环境变量文档

主要改进:

  • 自动检测 Next.js Standalone + ORM → 单独安装依赖
  • 自动检测高负载构建操作 → 优化构建命令
  • 自动生成所有配置文件 → 无需用户输入
阶段 3:构建验证(闭环)

加载并执行:modules/build-fix.md

流程:

  1. 执行 docker buildx build --platform linux/amd64 --load
  2. 成功 → 进入阶段 4
  3. 失败 → 解析错误、匹配模式、修复 Dockerfile 并重试
  4. 根据复杂度级别设置最大迭代次数
阶段 4:运行时验证

关键新增内容:在运行时验证通过之前,不要宣布成功!

验证步骤:

  1. 容器启动:运行 docker-compose up -d 并确认没有崩溃
  2. 数据库迁移:
  • 查询数据库:psql -c "\dt" → 确认表已创建
  • 检查迁移数量是否符合预期(例如,76/76)
  • 确认没有出现“relation does not exist”错误
  1. 应用健康状况:
  • 测试 HTTP 端点 → 200/302/401 均可接受,500 表示失败
  • 检查日志中的错误
  • 验证健康检查端点
  1. 成功标准:只有全部通过后才能宣布成功

为何重要:

  • 之前:运行 docker build 后就宣布成功,但应用在运行时无法工作
  • 现在:确认迁移已运行、数据库已填充,且应用实际可用
  • 避免迁移静默失败(例如,独立模式缺少 ORM 依赖)

支持资源

复杂度级别

级别标准最大构建迭代次数
L1单一语言、无需构建步骤、无外部服务、无迁移1
L2有构建步骤、有外部服务(DB/Redis)、简单迁移3
L3Monorepo、多种语言、复杂依赖、构建时环境变量、复杂迁移(76+)5

常见问题与解决方案

1. 数据库迁移未运行 - 最关键

症状:运行时出现 relation "users" does not exist 原因:检测到迁移,但从未执行 预防:分析阶段的步骤 12 会检测迁移并配置执行方式 修复:

  • 对于 Standalone + ORM:单独安装 ORM 依赖
  • 在入口点脚本中添加运行时迁移
  • 容器启动后使用 psql -c "\dt" 验证
2. 构建时内存不足

症状:退出代码 137、Killed、堆内存溢出 原因:构建脚本包含对 39+ 个工作区包执行的 lint/类型检查 预防:分析阶段的步骤 13 会检测高资源消耗操作 修复:在 Docker 构建中跳过 CI 任务,将 NODE_OPTIONS 增加到 8192MB

3. 找不到工作区文件

症状:ENOENT: no such file or directory, open '/app/e2e/package.json' 原因:.dockerignore 排除了工作区的 package.json 文件 修复:使用 e2e/* 替代 e2e,然后添加 !e2e/package.json

4. lockfile=false 项目

症状:Cannot generate lockfile because lockfile is set to false 原因:项目在 .npmrc 中设置了 lockfile=false 修复:使用 pnpm install 替代 pnpm install --frozen-lockfile

5. 缺少构建时环境变量

症状:KEY_VAULTS_SECRET is not set 原因:Next.js SSG 在构建时需要环境变量 修复:在构建阶段添加 ARG/ENV 占位符

6. Node 二进制文件路径

症状:spawn /bin/node ENOENT 原因:脚本硬编码了 /bin/node,但 node:slim 将其安装在 /usr/local/bin/node 修复:添加 RUN ln -sf /usr/local/bin/node /bin/node

7. Standalone 模式下找不到 ORM

症状:运行时出现 Cannot find module 'drizzle-orm' 原因:Next.js standalone 不包含全部 node_modules 预防:分析阶段会检测 standalone + ORM 组合 修复:在 /deps 中单独安装 ORM,并复制到最终镜像

8. 使用错误的 monorepo 自定义 CLI 构建命令

症状:构建成功,但缺少输出文件(例如,未找到 assets-manifest.json) 原因:使用了 yarn workspace @scope/pkg build,而不是检测到的自定义 CLI 语法 预防:分析阶段的 Step 14 会检测自定义 CLI 修复:所有构建命令都使用检测到的 CLI 语法

9. 需要 Git 哈希,但 Docker 上下文中没有 .git

症状:出现 Failed to open git repo 或 nodegit 错误 原因:构建工具需要 Git 提交哈希来进行版本管理 预防:分析阶段的 Step 14 会检测 Git 哈希依赖 修复:设置 ENV GITHUB_SHA=docker-build 以绕过 Git 要求

10. CLI 配置文件被 .dockerignore 排除

症状:CLI 初始化(例如,${CLI_NAME} init)静默失败 原因:.prettierrc、.prettierignore 或其他配置文件被排除 预防:分析阶段的 Step 14 会检测配置文件依赖 修复:从 .dockerignore 排除项中移除配置文件

11. 运行时找不到静态资源

症状:ENOENT: no such file or directory, open '/app/static/assets-manifest.json' 原因:前端构建输出路径与后端预期路径不同 预防:分析阶段的 Step 14 会检测静态资源路径映射 修复:在 Dockerfile 中将前端输出复制到后端预期的路径

成功标准

成功的 Dockerfile 必须满足以下要求:

构建阶段:

  1. 构建无错误(docker buildx build 以 0 退出)
  2. 镜像大小合理(大多数应用小于 2 GB)
  3. 遵循生产环境最佳实践(多阶段构建、非 root 用户、固定版本)
  4. 包含所有必要的支持文件(.dockerignore、docker-compose.yml 等)
  5. 满足所有工作区/monorepo 要求

运行阶段 - 至关重要: 6. 容器成功启动(无崩溃) 7. 成功执行数据库迁移(如果检测到迁移) 8. 已创建数据库表(使用 psql 验证) 9. 应用返回有效的 HTTP 状态码(200/302/401,而不是 500) 10. 日志中没有运行时错误(没有“relation does not exist”等错误)

出现以下情况时,不要宣称成功:

  • 构建通过,但运行时失败
  • 检测到迁移,但缺少数据库表
  • 应用返回 500 错误
  • 日志显示数据库关系错误

构建后全面验证

构建成功后,执行完整验证:

# 1. Start services
docker-compose up -d
sleep 30 # Wait for startup

# 2. Check container status
docker-compose ps
# Expected: All containers UP and HEALTHY

# 3. Verify database migrations
if [ migrations_detected ]; then
 # List tables
 docker-compose exec postgres psql -U <user> -d <db> -c "\dt"
 # Expected: List of tables (users, sessions, etc.)
 # If "Did not find any relations" → FAIL

 # Count migrations
 MIGRATION_COUNT=$(docker-compose exec postgres psql -U <user> -d <db> -t -c "SELECT COUNT(*) FROM <migration_table>;")
 # Expected: Matches analysis count (e.g., 76)
fi

# 4. Test application health
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3210)
# Expected: 200, 302, or 401
# Unacceptable: 500, 502, 503

if [ "$HTTP_CODE" = "500" ]; then
 echo "FAILURE: App returning 500 error"
 docker-compose logs app
 exit 1
fi

# 5. Check for errors in logs
docker-compose logs app | grep -i "error" | tail -20
# Should NOT contain:
# - "relation does not exist"
# - "table not found"
# - "Cannot find module"

# 6. Check image size
docker images <image-name>

# 7. Cleanup (if needed)
docker-compose down

验证清单:

  • 镜像构建成功
  • 容器启动且未崩溃
  • 已建立数据库连接
  • 已执行迁移(如适用)
  • 数据库表已存在(如适用)
  • HTTP 端点返回有效状态
  • 应用日志中没有错误
  • 健康检查通过

评论

支持 Markdown