关于 docker-to-sealos
docker-to-sealos 是将 Docker Compose 文件或安装文档转换为 Sealos 模板的技能,面向需要迁移应用部署配置的开发者。它按资源顺序生成模板,并结合数据库规则和验证流程处理转换。
主要功能
- 01分析 Compose 或安装文档
- 02推断应用元数据
- 03按顺序生成 Sealos 资源
- 04转换服务、存储与环境变量
- 05按数据库策略生成资源
- 06验证生成的模板
适用场景
- 01将 Docker Compose 应用迁移到 Sealos
- 02根据安装文档生成 Sealos 模板
- 03为多服务应用转换部署配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ zjy365/ sealos-skills --skill docker-to-sealos安装后在 Claude Code 中输入/docker-to-sealos确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/conversion-mappings.mddatabase-templates.mdexample-guide.mdfrappe-bench.mdmust-rules-map.yamlrules-registry.yamlsealos-specs.mdscripts/check_consistency_context.pycheck_consistency_engine.pycheck_consistency_helpers_storage.pycheck_consistency_helpers_violations.pycheck_consistency_helpers_workload.pycheck_consistency_line_locator.pycheck_consistency_models.pycheck_consistency_parser.pycheck_consistency_registry.pycheck_consistency_rule_helpers.pycheck_consistency_rule_registry.pycheck_consistency_rules_app.pycheck_consistency_rules_security.pycheck_consistency_rules_storage.pycheck_consistency_rules.pycheck_consistency_runner.pycheck_consistency.pycheck_must_coverage.pycompose_to_template.pypath_converter.pyquality_gate.pytest_check_consistency.pytest_check_must_coverage.py详细介绍
Docker 到 Sealos 模板转换器
概述
将 Docker Compose 文件或安装文档转换为适用于生产环境的 Sealos 模板。 自动完成端到端流程(分析、转换、验证、输出),无需向用户询问缺失字段。
治理与规则优先级
请按以下优先级执行,以防止规则偏移:
SKILL.md中的 MUST 规则(本文件)references/sealos-specs.md和references/database-templates.mdreferences/conversion-mappings.md和references/example-guide.md
如果低优先级参考文档与高优先级 MUST 规则冲突,请更新低优先级文件。 不要保留相互冲突的示例。
工作流
步骤 1:分析输入
从 Docker Compose 或文档中提取:
- 应用服务与数据库服务
- 卷/配置挂载/对象存储需求
- 端口、依赖项、服务通信
- 环境变量和密钥的使用情况
- 启动时对引导凭据、API 密钥、盐值、密钥和功能标志的验证规则
- 多服务 Web 角色:浏览器入口、REST API、OpenAI/API 网关、文档、工作进程和一次性任务
- 资源限制/请求和健康检查
- 如果有官方 Kubernetes 安装文档/清单,也要提取应用运行时行为(引导管理员字段、外部端点/协议假设、健康探针、启动/初始化流程、迁移顺序)
步骤 2:推断元数据
推断并规范化:
- 应用名称、标题、描述、类别
- 官方 URL、gitRepo、图标来源(优先选择方形/圆形且以图标为主的资源,例如应用图标、网站图标或头像;避免使用矩形字标/文本 Logo)
- locale/i18n 元数据
步骤 3:按严格顺序规划资源
按以下顺序生成资源:
- Template CR
- ObjectStorageBucket(如有需要)
- 数据库资源(ServiceAccount → Role → RoleBinding → Cluster → Job,如有需要)
- 应用工作负载资源(ConfigMap/Secret → Deployment/StatefulSet → Service → Ingress)
- 应用资源(最后)
步骤 4:应用转换规则
应用 references/conversion-mappings.md 中的字段级映射,包括:
- 镜像固定版本和注解映射
- 端口/服务/Ingress 转换
- 环境变量转换和依赖项排序
- 存储转换和 vn 命名(
scripts/path_converter.py) - 服务名称到 Kubernetes FQDN 的转换
- 对于 DB URL/DSN 环境变量(例如
*_DATABASE_URL、*_DB_URL),当 Kubeblocksendpoint为 host:port 时,通过获准的secretKeyRef环境变量注入host/port/username/password,并使用$(VAR)展开来组合最终 URL - 边缘网关规范化:当 Compose 包含类似 Traefik 的边缘代理和业务服务时,跳过代理工作负载,并通过 Sealos Ingress 直接公开业务服务
- Sealos Ingress 的 TLS 卸载规范化:当业务服务同时公开 80 和 443 时,从工作负载/服务端口中移除 443,并移除容器内 TLS 证书挂载(例如
/etc/nginx/ssl、/etc/ssl、/certs),除非官方 Kubernetes 文档明确要求后端到服务的通信使用 HTTPS - 多服务 Web 规范化:在 App 资源中公开经过验证的浏览器入口;仅在 API/网关/文档属于预期的公开接口时公开;工作进程保持私有,不配置 Service/Ingress
- URL 拓扑:面向浏览器的环境变量必须使用公开 HTTPS URL;除非应用明确要求公开回调,否则服务器间环境变量必须使用 Kubernetes Service FQDN
- 优先使用
scripts/compose_to_template.py --kompose-mode always作为确定性的转换入口(为确保工作负载塑形可复现,需要kompose) - 当存在官方 Kubernetes 安装文档/清单时,执行双来源合并:以 Compose 作为拓扑基线,再根据官方 Kubernetes 指南调整应用运行时语义
步骤 5:应用数据库策略
- 数据库服务必须生成为 KubeBlocks
Cluster资源。请勿将 Compose 中的 PostgreSQL/MySQL/MongoDB/Redis/Kafka 数据库服务转换为原始 KubernetesDeployment或StatefulSet工作负载。 - PostgreSQL 必须遵循固定版本和结构要求。
- MySQL/MongoDB/Redis/Kafka 必须使用
references/database-templates.md中的模板和密钥命名方式。 - 如果应用数据库引导需要初始化,请添加 DB init Job/initContainer。
- 对于自定义 PostgreSQL 数据库(非
postgres),init Job 必须在执行前等待 PostgreSQL 就绪,并以幂等方式创建目标数据库。 - 必须在实时数据库状态中验证关键应用兼容对象。对于应用在每次冷启动时都需要的兼容视图、旧版表/视图、索引、扩展、搜索路径和引导状态,请使用幂等的 initContainer 进行自愈。
- 一次性 init Job 可以创建初始数据库或植入初始状态,但应用启动门控必须直接验证最终数据库对象。将 TTL 到期的 Job 视为历史证据,并以数据库状态作为验收依据。
- 依赖应用迁移的 Worker、gateway 和后台服务必须等待所需表、迁移标记或应用专用就绪对象,而不能只等待数据库端口就绪。
- 如果就绪不依赖凭据,Redis 就绪探针或 initContainer 必须能够容忍经过身份验证的 Redis 响应,例如
NOAUTH或Authentication required。 - PostgreSQL 引导 shell 必须采用安全的引用方式。尽可能优先使用 shell 级存在性检查和简单 SQL 语句。对于 psql 变量插值,请使用单引号 heredoc 或 SQL 文件;如果守卫查询可以表达相同逻辑,请避免在内联 shell 命令中使用 PL/pgSQL
DO $$块。 - 请勿使用
psql -c "..."进行:'var'变量插值。请使用psql -v name=value <<'SQL' ... :'name' ... SQL,或传入已经安全处理的字面量 SQL。
步骤 6:生成输出文件
始终生成:
template/<app-name>/index.yaml- 如果能确定官方图标,则生成
template/<app-name>/logo.<ext>;优先使用以方形/圆形图标为主的图稿,避免使用矩形字标/文字 Logo
绝不创建:
template/<app-name>/README.mdtemplate/<app-name>/README_zh.md
README 编写不属于此技能的范围。如果 Template CR 要求 README URL,只在 index.yaml 中填写 URL 字段,并将文件创建工作留给专门的 README 技能。
步骤 7:输出前验证
交付模板输出前,运行验证器和自测。 如果验证失败,请先修复模板/规则/示例。
必须遵守的规则(精简版)
命名和元数据
- 模板的
metadata.name必须硬编码为小写;不要使用${{ defaults.app_name }}。 - 模板 CR 文件夹名称必须与
metadata.name一致。 - 模板 CR 必须包含必需的元数据字段(
title、url、gitRepo、author、description、icon、templateType、locale、i18n、categories)。 - 模板的
spec.readme必须指向https://raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/<app-name>/README.md。 - 模板的
spec.i18n.zh.readme必须指向https://raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/<app-name>/README_zh.md。 - 这些 README 字段仅在
index.yaml中作为 URL 引用;本技能不得创建或更新所引用的 README 文件。 iconURL 必须指向模板仓库中此应用在kb-0.9分支上的原始文件路径。template/<app-name>/logo.<ext>必须使用方形或圆形、以图标为主的图稿(例如应用图标、favicon、头像),不得使用矩形文字标志。i18n.zh.description必须使用简体中文撰写。- 如果
i18n.zh.title与title相同,则省略。 categories只能使用预定义值(tool、ai、game、database、low-code、monitor、dev-ops、blog、storage、frontend、backend)。
应用资源
- 应用资源必须使用
spec.data.url。 - 应用资源的
spec.displayType必须为normal。 - 应用资源的
spec.type必须为link。 - 应用资源的
spec.data.url必须是从全新启动的 Sealos 中可成功访问的浏览器入口 URL。对于具有 safe-path、setup-path 或 entrance-path 行为的应用,请验证配置的路径和根路径,然后选择一个无需隐藏的先前导航即可支持登录或首次运行设置的 URL。 - SSR/Next.js/React 服务端应用不得将会渲染服务端异常的路径用作应用 URL 或 HTTP 探测路径。即使 HTTP 状态为 2xx/3xx,只要可见文本中出现
Application error、server-side exception、Internal Server Error或Unhandled Runtime Error,就应视为入口路径失败。 - 不得在应用资源中使用
spec.template。 cloud.sealos.io/app-deploy-manager标签值必须与资源的metadata.name相同。- 对于受管应用工作负载,
metadata.labels.app标签值必须与资源的metadata.name相同。 - 对于受管应用工作负载,主业务容器名称必须与工作负载的
metadata.name相同;边车容器或辅助容器可以使用不同的描述性名称。 - 应用
Service资源必须定义metadata.labels.app和metadata.labels.cloud.sealos.io/app-deploy-manager,且这两个标签都必须与spec.selector.app相同。 - 运行时组件级
ConfigMap资源必须定义metadata.labels.app和metadata.labels.cloud.sealos.io/app-deploy-manager,且这两个标签都必须与metadata.name相同;仅供 init 容器将初始配置复制到持久化存储的引导专用 ConfigMap 不得定义这两个标签。 - 应用
Service资源的metadata.name、metadata.labels.app、metadata.labels.cloud.sealos.io/app-deploy-manager和spec.selector.app必须使用相同的组件名称。 - 根路径
Ingress资源(pathType: Prefix、path: /)的metadata.name、metadata.labels.cloud.sealos.io/app-deploy-manager和后端service.name必须使用相同的组件名称;非根路径或非 Prefix 的 Ingress 规则可以路由到不同的后端服务。 - 必须显式设置 Service
spec.ports[*].name(多端口服务必需)。 - HTTP Ingress 必须包含所需的 nginx 注解(
kubernetes.io/ingress.class、nginx.ingress.kubernetes.io/proxy-body-size、nginx.ingress.kubernetes.io/server-snippet、nginx.ingress.kubernetes.io/ssl-redirect、nginx.ingress.kubernetes.io/backend-protocol、nginx.ingress.kubernetes.io/client-body-buffer-size、nginx.ingress.kubernetes.io/proxy-buffer-size、nginx.ingress.kubernetes.io/proxy-send-timeout、nginx.ingress.kubernetes.io/proxy-read-timeout、nginx.ingress.kubernetes.io/configuration-snippet),并使用预期的默认值。 - CronJob 资源必须定义
cloud.sealos.io/cronjob、cronjob-launchpad-name和cronjob-type标签;cloud.sealos.io/cronjob必须与metadata.name相同,cronjob-launchpad-name必须为"",且cronjob-type必须为image。 - 如果有官方应用健康检查,受管工作负载必须定义
livenessProbe、readinessProbe,以及(对于引导较慢的应用)startupProbe,并与官方端点或命令保持一致。
与官方 Kubernetes 保持一致
- 如果有官方 Kubernetes 安装文档或清单,转换时必须参考这些资料,并在生成模板产物之前确保关键运行时设置保持一致。
- 当官方 Kubernetes 文档或清单与 Compose 不一致时,对于应用行为(引导管理员字段、外部端点/环境变量/协议、健康探测),优先采用官方 Kubernetes 运行时语义,除非这样做会违反优先级更高的 Sealos MUST/安全约束。
镜像和拉取策略
- 不要使用
:latest。 - 使用
crane解析版本:优先使用明确的版本标签(例如v2.2.0);只有在无法获得确定的版本标签时,才回退到固定摘要。 - 避免使用浮动标签(例如
:v2、:2.1、:stable);请使用明确的版本标签或摘要。 - 受管理工作负载的镜像引用必须明确,且不得包含 Compose 风格的变量表达式(例如
${VAR}、${VAR:-default});生成模板文件前,请先解析为明确的标签或摘要。 - 应用的
originImageName必须与容器镜像一致。 - 使用公共镜像的受管理应用工作负载必须省略
template.spec.imagePullSecrets;使用私有注册表的工作负载只能引用应用范围的拉取 Secret${{ defaults.app_name }}。 - 注册表拉取 Secret 由
sealos-deploy在运行时使用本地ghCLI 凭证为私有 GHCR 镜像管理;请勿在生成的模板中公开原始注册表凭证输入。 - 所有容器都必须显式设置
imagePullPolicy: IfNotPresent。
存储
- 不要使用
emptyDir。 - 需要存储时,请使用持久化存储模式(
volumeClaimTemplates)。 - 配置了
volumeClaimTemplates的 StatefulSet 资源必须设置metadata.labels.cloud.sealos.io/deploy-on-sealos: ${{ defaults.app_name }},并且每个volumeClaimTemplates[].metadata.labels.cloud.sealos.io/deploy-on-sealos都必须设置为${{ defaults.app_name }},以便 Template 跟踪和清理 PVC。 - PVC 请求必须
<= 1Gi,除非源规范明确要求更小的值。 - ConfigMap 数据键必须遵循 vn 命名规则(
scripts/path_converter.py),包括/、-、.和其他特殊字符。 - 由受管理 Deployment/StatefulSet 工作负载挂载的 ConfigMap,其
metadata.name必须与工作负载的metadata.name相同。 - ConfigMap 工作负载卷必须使用
<workload-name>-cm,并且每个 ConfigMapdata键都必须作为独立的volumeMount挂载,其subPath必须与该键完全相同。 - 避免在
command/args中内联冗长的启动脚本或 heredoc;请将初始化脚本和启动脚本放入 ConfigMap 文件中,并使用简短命令调用。
环境变量和机密信息
- 非数据库的敏感值/输入使用直接的
env[].value。 - 业务容器必须通过
env[].valueFrom.secretKeyRef,从获批的 Kubeblocks 数据库机密信息中获取数据库连接字段(endpoint、host、port、username、password);例外情况:如果 Redis 机密信息仅公开凭据,Redis 的host/port可以使用 Sealos Redis Service FQDN 和6379;如果 MongoDB 机密信息仅公开凭据,MongoDB 连接 URL 可以使用 Sealos MongoDB Service FQDN 和27017。 - 业务容器不得引用自定义的 env/volume
Secret,获批的 Kubeblocks 数据库机密信息和对象存储机密信息除外。 - 仅私有镜像可以使用专用的、作用域限定到应用的镜像拉取
Secret,且只能通过template.spec.imagePullSecrets引用;公共镜像不得添加拉取机密信息。 - 数据库连接/引导可以使用 Kubeblocks 提供的机密信息,且不得通过自定义
Secret资源重新定义保留的 Kubeblocks 数据库机密信息名称。 - 环境变量必须先声明,再引用(例如,先声明密码,再组合 URL)。
- 遵循应用的官方环境变量命名规范;不得自行发明前缀。
- 对于前端/API/网关拆分的应用,公有浏览器 URL 和内部服务 URL 必须分开。前端/浏览器回调变量使用
https://${{ defaults.<host> }}.${{ SEALOS_CLOUD_DOMAIN }};后端到后端的变量使用http://<service>.$(SEALOS_NAMESPACE).svc.cluster.local:<port>或完整渲染后的 Service FQDN。 - 如果应用要求通过基于文件的配置系统(例如 node-config
config/default.json、PHP 配置文件)配置公有 URL,则创建一个 ConfigMap,其中包含将公有 URL 设置为https://${{ defaults.app_host }}.${{ SEALOS_CLOUD_DOMAIN }}的配置文件,并将其挂载到应用的配置目录。ConfigMap 必须遵循标准命名和标签规范。 - 对于 PostgreSQL 自定义数据库(非
postgres),包含${{ defaults.app_name }}-pg-initJob,并实现可安全重复执行的创建逻辑(等待就绪 + 创建前检查是否存在)。 - 对于应用特定的数据库兼容性,在业务容器启动前,包含一个 initContainer 或启动门控,以幂等方式创建或修复所需的视图、别名、索引、扩展、权限、角色搜索路径和旧版兼容对象。
- 托管应用主容器的
command/args必须与镜像的官方入口点保持接近。仅保留官方启动命令、Compose 原生参数或简短的 exec 包装器;将文件准备、权限修复、数据库引导和兼容性自修复移至 initContainer、Job 或 ConfigMap 脚本中。 - 业务主容器中的 Shell 包装器必须对最终进程使用
exec,以确保信号处理正确。 - 数据库引导 SQL 必须确保可在 Shell 中安全执行:优先使用 Shell 层级的守卫查询和简单 SQL,为 psql 变量使用单引号 heredoc,并避免使用无保护的内联
DO $$块。 psql -c不得包含:'var'这种 psql 变量语法;需要-v插值的 SQL 请使用 heredoc。
数据库专属约束
- 数据库服务必须使用 KubeBlocks
Cluster资源,不得使用应用Deployment或StatefulSet工作负载。仅有状态应用组件可以使用StatefulSet,PostgreSQL/MySQL/MongoDB/Redis/Kafka 数据库服务绝不能使用。 - PostgreSQL 版本:
postgresql-16.4.0。 - PostgreSQL API:
apps.kubeblocks.io/v1alpha1。 - PostgreSQL RBAC 统一命名:
${{ defaults.app_name }}-pg。 - PostgreSQL RBAC 必须包含
app.kubernetes.io/instance和app.kubernetes.io/managed-by标签。 - 每个 KubeBlocks 数据库
Cluster都必须包含kb.io/database、sealos-db-provider-cr和clusterdefinition.kubeblocks.io/name标签;sealos-db-provider-cr必须与metadata.name相同,以便 dbprovider 列出并分类数据库。相关 Pods、Services 和 OpsRequests 应携带app.kubernetes.io/instance=<database name>,以用于详情视图。 - PostgreSQL 角色通配符权限要求仍按当前规范定义。
- PostgreSQL 集群必须包含必需的标签/字段(
kb.io/database: postgresql-16.4.0、clusterdefinition.kubeblocks.io/name: postgresql、clusterversion.kubeblocks.io/name: postgresql-16.4.0、clusterVersionRef: postgresql-16.4.0、disableExporter: true、enabledLogs: [running]、switchPolicy.type: Noop、serviceAccountName)。 - MongoDB 集群必须遵循升级后的结构(
componentDef: mongodb、serviceVersion: 8.0.4、标签kb.io/database和app.kubernetes.io/instance)。 - MySQL 集群必须遵循升级后的结构(
kb.io/database: ac-mysql-8.0.30-1、clusterDefinitionRef: apecloud-mysql、clusterVersionRef: ac-mysql-8.0.30-1、tolerations: [])。 - Redis 集群必须遵循升级后的结构(
componentDef: redis-7、componentDef: redis-sentinel-7、serviceVersion: 7.2.7、主数据 PVC1Gi、拓扑replication)。 - 数据库集群组件资源必须使用
limits(cpu=500m,memory=512Mi)和requests(cpu=50m,memory=51Mi),除非源文档明确要求其他配置。 - 所有受管理的工作负载容器资源都必须使用 Sealos 资源阶梯:
limits.cpu仅可为100m/200m/500m/1/2/3/4/8,limits.memory仅可为128Mi/256Mi/512Mi/1024Mi/2048Mi/4096Mi/8192Mi/16384Mi,并且requests必须从limits推导,即去掉最后一位数字(500m→50m、512Mi→51Mi、1→100m、1024Mi→102Mi、4096Mi→409Mi)。不得自行指定不在阶梯中的值,且绝不能使用2G/4G/8G/16G,因为 Sealos Template API 配额预览可能会将不带单位的G内存解析为 0。 - Secret 命名:
- MongoDB:
${{ defaults.app_name }}-mongo-mongodb-account-root(或 MongoDB 集群名称使用-mongodb时采用${{ defaults.app_name }}-mongodb-mongodb-account-root) - Redis:
${{ defaults.app_name }}-redis-redis-account-default(出于向后兼容考虑,可能接受旧命名${{ defaults.app_name }}-redis-account-default) - Kafka:
${{ defaults.app_name }}-broker-account-admin - 除受支持的例外情况外,不得使用旧命名。
- MongoDB:
基线运行时默认值
除非源文档明确要求其他配置,否则使用轻量级应用阶梯项:
- 容器限制:
cpu=200m、memory=256Mi - 容器请求:
cpu=20m、memory=25Mi revisionHistoryLimit: 1- 默认
automountServiceAccountToken: false;只有当应用有明确的 Kubernetes API/服务账户令牌需求时才设为true,此类需求须由 Kubernetes 集成设置、serviceAccountName或工作负载注解sealos.io/service-account-token-reason证明。
如需更多资源,只能切换到另一个允许的 limits 阶梯项,并根据该 limits 值重新计算 requests。
浏览器/远程桌面资源验证
对于浏览器、VNC、WebRTC 桌面、Xvfb、Selkies、noVNC、Kasm 或远程桌面类容器:
- 不要将简短的冒烟测试视为稳定最低内存值的证明。
- 使用全新部署验证内存,而不只是修补现有的热 Pod。
- 测试冷启动直至就绪、轻量级页面、真实/中等负载页面、交互式/搜索页面,以及冒烟测试后 60 秒的稳定性检查。
- 如果冒烟测试期间观测到的 cgroup 内存超过限制的 80%,则提升到下一个允许的 Sealos 内存阶梯值。
- 按照 Sealos 资源阶梯,根据限制值推导请求值。
示例:
- 错误:Chrome 在
512Mi下通过了简短的冒烟测试,但内存达到503Mi;将512Mi作为稳定的最低值不安全。 - 正确:提高到
1024Mi,将请求值设为102Mi,然后重新运行冒烟测试和稳定性检查。
对于最大显示分辨率为 4K 的 Chrome + Xvfb + Selkies,至少使用:
- 限制:
cpu=200m、memory=1024Mi - 请求:
cpu=20m、memory=102Mi
默认值与输入值
defaults用于生成的值(app_name、app_host、随机密码/密钥)。inputs仅用于真正由用户提供的运维值(电子邮件/SMTP/外部 API 密钥等)。- 当用户明确要求输入应用管理员凭据时,在
spec.inputs中声明管理员用户名/密码,将其作为直接环境变量传入,并通过应用文档说明的引导或初始化路径应用这些值。数据库凭据应保留在 KubeBlocks 密钥中。 - 模板产物中的每个
${{ inputs.<name> }}引用,都必须在同一个 Template CR 中有对应的spec.inputs.<name>声明。 inputs.description必须使用英文。- 对启动至关重要的
inputs[*].default值必须符合应用文档所述的启动验证要求。对于有复杂度规则的管理员/引导密码,不要使用''、弱密码示例或单独的${{ random(n) }},因为生成的字符可能不包含必需的字符类别;应在随机部分周围包含确定的必需字符类别,例如"AppName@${{ random(16) }}!1"。 - 如果应用会在必需输入较弱或为空时退出,则应将输入默认值视为运行时契约的一部分。实时验证必须包含首次启动日志,以及使用生成的默认值进行的登录/设置流程。
- 对于二进制对象存储选项,使用布尔型输入(例如
enable_s3_storage),并通过inputs.<name> === 'true'进行测试。
验证命令
最终回复前运行所有检查:
python scripts/path_converter.py --self-testpython scripts/test_check_consistency.pypython scripts/test_compose_to_template.pypython scripts/test_check_must_coverage.pypython scripts/check_consistency.py --skill SKILL.md --references references --rules-file references/rules-registry.yamlpython scripts/check_consistency.py --skill SKILL.md --references references --rules-file references/rules-registry.yaml --artifacts template/<app-name>/index.yamlpython scripts/check_must_coverage.py --skill SKILL.md --mapping references/must-rules-map.yaml --rules-file references/rules-registry.yaml8.(CI/一次性运行)python scripts/quality_gate.py(默认需要template/*/index.yaml;仅在没有产物的开发/调试场景中设置DOCKER_TO_SEALOS_ALLOW_EMPTY_ARTIFACTS=1)- 实时部署验收:
sealos-deploy创建应用后,在报告成功前,验证实际的 App URL、Web 应用的登录/设置流程、近期日志、预期数据库对象以及完整资源占用情况。
check_consistency.py 由注册表驱动。确保 references/rules-registry.yaml 与已实现的规则保持同步。
注册表规则条目支持 severity 以及可选的 scope.include_paths 元数据。
输出约定
转换完成后,请提供:
- 简要转换摘要
- 目标文件路径(
template/<app-name>/index.yaml) - 完整的模板 YAML
- 仅在存在歧义时说明关键决策
请勿在此技能中创建或输出 README 内容。README 生成工作由另一个技能负责。
参考资料导航(渐进式加载)
仅加载当前任务所需的参考资料:
references/sealos-specs.md- 权威的排序、标签以及 App/Ingress/ConfigMap 约定
references/conversion-mappings.md- Docker→Sealos 字段级映射和边缘转换
references/database-templates.md- 数据库模板、RBAC 结构和 Secret 命名模式
references/frappe-bench.md- Frappe/ERPNext/HRMS/bench 转换模式、初始化资源、幂等站点引导和常见失败特征
references/example-guide.md- 示例和模式说明(非权威)
references/rules-registry.yaml- 机器可读的验证范围/规则列表
references/must-rules-map.yaml- MUST 条目与执行方式(
rule或manual)的映射,用于防止规则偏移
- MUST 条目与执行方式(
脚本工具
scripts/path_converter.py- 将路径转换为 vn 名称
- 支持自测以进行回归检查
scripts/compose_to_template.py- 确定性的 compose/docs 到模板生成器入口
- 支持
--kompose-mode auto|always|never(默认值为always),以复用kompose convert工作负载结构 - 输出
template/<app-name>/index.yaml
scripts/test_compose_to_template.py- compose 转换行为的回归测试
scripts/check_consistency.py- 基于注册表的一致性验证器
scripts/test_check_consistency.py- 验证器行为的回归测试
scripts/check_must_coverage.py- 根据注册表规则验证 MUST 条目覆盖映射
scripts/test_check_must_coverage.py- MUST 覆盖验证器的回归测试
边缘策略
- 绝不因缺少字段而询问用户;应根据 compose/docs 和平台约定推断。
- App 资源应保持
spec.data.url格式;绝不使用spec.template。 - App 资源应保持
spec.displayType: normal和spec.type: link;不要推断其他枚举值。 - business-env、对象存储和 DB-secret 策略应与 MUST 规则保持一致。
- 优先选择方形/圆形、以图标为主的 Logo 素材(应用图标/favicon/avatar),避免使用矩形文字商标或文字 Logo。
- 优先使用 Sealos 管理的 Ingress,而非捆绑的边缘代理:如果 Traefik 网关仅用作 Ingress/前置代理,且至少存在一个业务服务,则不要输出 Traefik 工作负载资源。
- 优先在 Sealos Ingress 中终止网关 TLS,而非在容器内终止 TLS:对于双端口 HTTP/HTTPS 工作负载,应保留 HTTP 服务端口,并移除冗余的 HTTPS/证书挂载,除非官方文档要求 HTTPS 后端。
- 绝不创建
template/<app-name>/README.md或template/<app-name>/README_zh.md;仅在模板架构要求时,于index.yaml中保留 README URL 引用。 - 出现冲突时,优先修正参考资料/示例,而不是增加例外。
- 如果目标应用有官方 Kubernetes 安装文档/清单,不要忽略;应使用这些资料在 Compose 默认值之外完善运行时语义。
- 如果项目提及 Frappe、ERPNext、HRMS 或
bench,生成应用工作负载前必须先加载references/frappe-bench.md。