{"id":"9dc0daab-ba6f-45e3-b6fc-0d6abd81f6cd","shortId":"MGB3zA","kind":"skill","title":"docker-to-sealos","tagline":"Convert Docker Compose files or installation docs into production-grade Sealos templates. Use when user has a docker-compose.yml and wants a Sealos or Kubernetes template, wants to migrate from Docker Compose to Sealos, needs to convert container orchestration configs to Sealos f","description":"# Docker to Sealos Template Converter\n\n## Overview\n\nConvert Docker Compose files or installation docs into production-grade Sealos templates.\nExecute end-to-end automatically (analysis, conversion, validation, output) without asking users for missing fields.\n\n## Governance and Rule Priority\n\nUse the following precedence to prevent rule drift:\n\n1. `SKILL.md` MUST rules (this file)\n2. `references/sealos-specs.md` and `references/database-templates.md`\n3. `references/conversion-mappings.md` and `references/example-guide.md`\n\nIf lower-priority references conflict with higher-priority MUST rules, update the lower-priority files.\nDo not keep conflicting examples.\n\n## Workflow\n\n### Step 1: Analyze input\n\nExtract from Docker Compose/docs:\n\n- application services vs database services\n- volumes/config mounts/object storage requirements\n- ports, dependencies, service communication\n- env vars and secret usage\n- resource limits/requests and health checks\n- if official Kubernetes installation docs/manifests are available, also extract app-runtime behavior from them (bootstrap admin fields, external endpoint/protocol assumptions, health probes, startup/init flow)\n\n### Step 2: Infer metadata\n\nInfer and normalize:\n\n- app name, title, description, categories\n- official URL, gitRepo, icon source\n- locale/i18n metadata\n\n### Step 3: Plan resources in strict order\n\nGenerate resources in this order:\n\n1. Template CR\n2. ObjectStorageBucket (if needed)\n3. Database resources (ServiceAccount → Role → RoleBinding → Cluster → Job if needed)\n4. App workload resources (ConfigMap/Secret → Deployment/StatefulSet → Service → Ingress)\n5. App resource (last)\n\n### Step 4: Apply conversion rules\n\nApply field-level mappings from `references/conversion-mappings.md`, including:\n\n- image pinning and annotation mapping\n- port/service/ingress conversion\n- env var conversion and dependency ordering\n- storage conversion and vn naming (`scripts/path_converter.py`)\n- service-name to Kubernetes FQDN conversion\n- for DB URL/DSN envs (for example `*_DATABASE_URL`, `*_DB_URL`), when Kubeblocks `endpoint` is host:port, inject `host`/`port`/`username`/`password` via approved `secretKeyRef` envs and compose the final URL with `$(VAR)` expansion\n- edge gateway normalization: when Compose includes Traefik-like edge proxy plus business services, skip the proxy workload and expose business services via Sealos Ingress directly\n- TLS offload normalization for Sealos Ingress: when a business service exposes both 80 and 443, drop 443 from workload/service ports and remove in-container TLS certificate mounts (for example `/etc/nginx/ssl`, `/etc/ssl`, `/certs`) unless official Kubernetes docs explicitly require HTTPS backend-to-service traffic\n- prefer `scripts/compose_to_template.py --kompose-mode always` as deterministic conversion entrypoint (require `kompose` for reproducible workload shaping)\n- when official Kubernetes installation docs/manifests exist, perform a dual-source merge: use Compose as baseline topology, then align app-runtime semantics with official Kubernetes guidance\n\n### Step 5: Apply database strategy\n\n- PostgreSQL must follow the pinned version and structure requirements.\n- MySQL/MongoDB/Redis/Kafka must use templates and secret naming from `references/database-templates.md`.\n- Add DB init Job/initContainer when application database bootstrap requires it.\n- For PostgreSQL custom databases (non-`postgres`), the init Job must wait for PostgreSQL readiness before execution and create the target database idempotently.\n\n### Step 6: Generate output files\n\nAlways produce:\n\n- `template/<app-name>/index.yaml`\n- `template/<app-name>/logo.<ext>` when official icon is resolvable\n\n### Step 7: Validate before output\n\nRun validator and self-tests before delivering template output.\nIf validation fails, fix template/rules/examples first.\n\n## MUST Rules (Condensed)\n\n### Naming and metadata\n\n- Template `metadata.name` must be hardcoded lowercase; do not use `${{ defaults.app_name }}`.\n- Template CR folder name must match `metadata.name`.\n- Template CR must include required metadata fields (`title`, `url`, `gitRepo`, `author`, `description`, `icon`, `templateType`, `locale`, `i18n`, `categories`).\n- Template `spec.readme` must be `https://raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/<app-name>/README.md`.\n- Template `spec.i18n.zh.readme` must be `https://raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/<app-name>/README_zh.md`.\n- `icon` URL must point to template repo raw path for this app on `kb-0.9` branch.\n- `i18n.zh.description` must be written in Simplified Chinese.\n- Omit `i18n.zh.title` when it is identical to `title`.\n- `categories` must only use predefined values (`tool`, `ai`, `game`, `database`, `low-code`, `monitor`, `dev-ops`, `blog`, `storage`, `frontend`, `backend`).\n\n### App resource\n\n- App resource must use `spec.data.url`.\n- App resource `spec.displayType` must be `normal`.\n- App resource `spec.type` must be `link`.\n- Never use `spec.template` in App resource.\n- `cloud.sealos.io/app-deploy-manager` label value must equal resource `metadata.name`.\n- `metadata.labels.app` label value must equal resource `metadata.name` for managed app workloads.\n- `containers[*].name` must equal workload `metadata.name` for managed app workloads.\n- Application `Service` resources must define `metadata.labels.app` and `metadata.labels.cloud.sealos.io/app-deploy-manager`, and both labels must match `spec.selector.app`.\n- Component-scoped `ConfigMap` resources must define `metadata.labels.app` and `metadata.labels.cloud.sealos.io/app-deploy-manager`, and both labels must match `metadata.name`.\n- Application `Service` resources must use the same component name across `metadata.name`, `metadata.labels.app`, `metadata.labels.cloud.sealos.io/app-deploy-manager`, and `spec.selector.app`.\n- Application `Ingress` resources must use the same component name across `metadata.name`, `metadata.labels.cloud.sealos.io/app-deploy-manager`, and backend `service.name`.\n- Service `spec.ports[*].name` must be explicitly set (required for multi-port services).\n- HTTP Ingress must include required nginx annotations (`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`) with expected defaults.\n- When official application health checks are available, managed workloads must define `livenessProbe`, `readinessProbe`, and (for slow bootstrap apps) `startupProbe`, aligned with official endpoints/commands.\n\n### Official Kubernetes alignment\n\n- If official Kubernetes installation docs/manifests are available, conversion must reference them and align critical runtime settings before emitting template artifacts.\n- When official Kubernetes docs/manifests and Compose differ, prefer official Kubernetes runtime semantics for app behavior (bootstrap admin fields, external endpoint/env/protocol, health probes), unless doing so violates higher-priority Sealos MUST/security constraints.\n\n### Images and pull policy\n\n- Do not use `:latest`.\n- Resolve versions with `crane`: prefer an explicit version tag (for example `v2.2.0`), and fallback to digest pin only when a deterministic version tag is unavailable.\n- Avoid floating tags (for example `:v2`, `:2.1`, `:stable`); use an explicit version tag or digest.\n- Managed workload image references must be concrete and must not contain Compose-style variable expressions (for example `${VAR}`, `${VAR:-default}`); resolve to explicit tag or digest before emitting template artifacts.\n- Application `originImageName` must match container image.\n- Managed app workloads must reference the app-scoped image pull Secret `${{ defaults.app_name }}` via `template.spec.imagePullSecrets`.\n- The registry pull Secret is runtime-managed by `sealos-deploy` using local `gh` CLI credentials for private GHCR images; do not expose raw registry credential inputs in generated templates.\n- All containers must explicitly set `imagePullPolicy: IfNotPresent`.\n\n### Storage\n\n- Do not use `emptyDir`.\n- Use persistent storage patterns (`volumeClaimTemplates`) where storage is needed.\n- PVC request must be `<= 1Gi` unless source spec explicitly requires less.\n- ConfigMap keys and volume names must follow vn naming (`scripts/path_converter.py`).\n\n### Env and secrets\n\n- Non-database sensitive values/inputs use direct `env[].value`.\n- Business containers must source database connection fields (`endpoint`, `host`, `port`, `username`, `password`) from approved Kubeblocks database secrets via `env[].valueFrom.secretKeyRef`.\n- Business containers must not use custom env/volume `Secret` references except approved Kubeblocks database secrets and object storage secrets.\n- A dedicated app-scoped registry pull Secret is allowed and should be referenced only through `template.spec.imagePullSecrets`.\n- Database connection/bootstrap may use Kubeblocks-provided secrets, and reserved Kubeblocks database secret names must not be redefined by custom `Secret` resources.\n- Env vars must be declared before referenced (for example password before URL composition).\n- Follow official app env var naming; do not invent prefixes.\n- When the application requires its public URL configured via a file-based config system (e.g., node-config `config/default.json`, PHP config files), create a ConfigMap containing the config file with the public URL set to `https://${{ defaults.app_host }}.${{ SEALOS_CLOUD_DOMAIN }}`, and mount it to the application's config directory. The ConfigMap must follow standard naming and label conventions.\n- For PostgreSQL custom databases (non-`postgres`), include `${{ defaults.app_name }}-pg-init` Job and implement startup-safe/idempotent creation logic (readiness wait + existence check before create).\n\n### Database-specific constraints\n\n- PostgreSQL version: `postgresql-16.4.0`.\n- PostgreSQL API: `apps.kubeblocks.io/v1alpha1`.\n- PostgreSQL RBAC unified naming: `${{ defaults.app_name }}-pg`.\n- PostgreSQL RBAC requires `app.kubernetes.io/instance` and `app.kubernetes.io/managed-by` labels.\n- PostgreSQL role wildcard permission requirement remains as defined in current spec.\n- PostgreSQL cluster must include required labels/fields (`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`).\n- MongoDB cluster must follow upgraded structure (`componentDef: mongodb`, `serviceVersion: 8.0.4`, labels `kb.io/database` and `app.kubernetes.io/instance`).\n- MySQL cluster must follow upgraded structure (`kb.io/database: ac-mysql-8.0.30-1`, `clusterDefinitionRef: apecloud-mysql`, `clusterVersionRef: ac-mysql-8.0.30-1`, `tolerations: []`).\n- Redis cluster must follow upgraded structure (`componentDef: redis-7`, `componentDef: redis-sentinel-7`, `serviceVersion: 7.2.7`, main data PVC `1Gi`, topology `replication`).\n- Database cluster component resources must use `limits(cpu=500m,memory=512Mi)` and `requests(cpu=50m,memory=51Mi)` unless source docs explicitly require otherwise.\n- Secret naming:\n  - MongoDB: `${{ defaults.app_name }}-mongodb-account-root`\n  - Redis: `${{ defaults.app_name }}-redis-redis-account-default`\n  - Kafka: `${{ defaults.app_name }}-broker-account-admin`\n  - Do not use legacy naming outside supported exceptions.\n\n### Baseline runtime defaults\n\nUnless source docs explicitly require otherwise, use:\n\n- container limits: `cpu=200m`, `memory=256Mi`\n- container requests: `cpu=20m`, `memory=25Mi`\n- `revisionHistoryLimit: 1`\n- `automountServiceAccountToken: false`\n\n### Defaults vs inputs\n\n- `defaults` for generated values (`app_name`, `app_host`, random passwords/keys).\n- `inputs` only for truly user-provided operational values (email/SMTP/external API keys, etc.).\n- `inputs.description` must be in English.\n\n## Validation Commands\n\nRun all checks before final response:\n\n1. `python scripts/path_converter.py --self-test`\n2. `python scripts/test_check_consistency.py`\n3. `python scripts/test_compose_to_template.py`\n4. `python scripts/test_check_must_coverage.py`\n5. `python scripts/check_consistency.py --skill SKILL.md --references references --rules-file references/rules-registry.yaml`\n6. `python scripts/check_consistency.py --skill SKILL.md --references references --rules-file references/rules-registry.yaml --artifacts template/<app-name>/index.yaml`\n7. `python scripts/check_must_coverage.py --skill SKILL.md --mapping references/must-rules-map.yaml --rules-file references/rules-registry.yaml`\n8. (CI / one-shot) `python scripts/quality_gate.py` (requires `template/*/index.yaml` by default; set `DOCKER_TO_SEALOS_ALLOW_EMPTY_ARTIFACTS=1` only for dev/debug without artifacts)\n\n`check_consistency.py` is registry-driven. Keep `references/rules-registry.yaml` in sync with implemented rules.\nRegistry rule entries support `severity` and optional `scope.include_paths` metadata.\n\n## Output Contract\n\nWhen conversion is complete, provide:\n\n1. brief conversion summary\n2. target file path (`template/<app-name>/index.yaml`)\n3. complete template YAML\n4. key decisions only where ambiguity existed\n\n## Reference Navigation (Progressive Loading)\n\nLoad only needed references for current task:\n\n- `references/sealos-specs.md`\n  - authoritative ordering, labels, App/Ingress/ConfigMap conventions\n- `references/conversion-mappings.md`\n  - Docker→Sealos field-level mappings and edge conversions\n- `references/database-templates.md`\n  - database templates, RBAC structures, secret naming patterns\n- `references/example-guide.md`\n  - examples and pattern walkthroughs (non-authoritative)\n- `references/rules-registry.yaml`\n  - machine-readable validation scope/rules list\n- `references/must-rules-map.yaml`\n  - MUST bullet to enforcement mapping (`rule` or `manual`) for drift control\n\n## Script Utilities\n\n- `scripts/path_converter.py`\n  - convert paths to vn names\n  - self-test support for regression checks\n- `scripts/compose_to_template.py`\n  - deterministic compose/docs-to-template generator entrypoint\n  - supports `--kompose-mode auto|always|never` (`always` is default) to reuse `kompose convert` workload shapes\n  - emits `template/<app-name>/index.yaml`\n- `scripts/test_compose_to_template.py`\n  - regression tests for compose conversion behavior\n- `scripts/check_consistency.py`\n  - registry-driven consistency validator\n- `scripts/test_check_consistency.py`\n  - regression tests for validator behavior\n- `scripts/check_must_coverage.py`\n  - validate MUST bullet coverage mapping against registry rules\n- `scripts/test_check_must_coverage.py`\n  - regression tests for MUST coverage validator\n## Edge Policies\n\n- Never ask users for missing fields; infer from compose/docs and platform conventions.\n- Keep App resource in `spec.data.url` format; never use `spec.template`.\n- Keep App resource `spec.displayType: normal` and `spec.type: link`; do not infer alternative enum values.\n- Keep business-env, object storage, and DB-secret policy consistent with MUST rules.\n- Prefer Sealos-managed ingress over bundled edge proxies: if a Traefik gateway is only acting as ingress/front-proxy and at least one business service exists, do not emit Traefik workload resources.\n- Prefer gateway TLS termination in Sealos Ingress over in-container TLS: for dual-port HTTP/HTTPS workloads, keep HTTP service port and remove redundant HTTPS/certificate mounts unless official docs require HTTPS backend.\n- Prefer fixing references/examples over adding exceptions when conflicts appear.\n- If official Kubernetes installation docs/manifests exist for the target app, do not ignore them; use them to refine runtime semantics beyond Compose defaults.","tags":["docker","sealos","seakills","labring","agent-skills","ai-agent","claude-code","cloud-native","codex","deployment","gemini-cli","kubernetes"],"capabilities":["skill","source-labring","skill-docker-to-sealos","topic-agent-skills","topic-ai-agent","topic-claude-code","topic-cloud-native","topic-codex","topic-deployment","topic-docker","topic-gemini-cli","topic-kubernetes","topic-sealos"],"categories":["seakills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/labring/seakills/docker-to-sealos","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add labring/seakills","source_repo":"https://github.com/labring/seakills","install_from":"skills.sh"}},"qualityScore":"0.458","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 17 github stars · SKILL.md body (16,146 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T13:03:12.469Z","embedding":null,"createdAt":"2026-04-19T00:40:52.999Z","updatedAt":"2026-04-22T13:03:12.469Z","lastSeenAt":"2026-04-22T13:03:12.469Z","tsv":"'-0.9':598 '-1':1365,1375 '-7':1385 '/app-deploy-manager':663,700,718,739,755 '/backend-protocol':793 '/certs':379 '/client-body-buffer-size':796 '/configuration-snippet':808 '/database':1347 '/database:':1312,1360 '/etc/nginx/ssl':377 '/etc/ssl':378 '/idempotent':1253 '/index.yaml':498,1558,1579,1633,1745 '/ingress.class':781 '/instance':1287,1351 '/labring-actions/templates/kb-0.9/template/':574,582 '/logo':500 '/managed-by':1291 '/name:':1317,1321 '/proxy-body-size':784 '/proxy-buffer-size':799 '/proxy-read-timeout':805 '/proxy-send-timeout':802 '/readme.md':575 '/readme_zh.md':583 '/server-snippet':787 '/ssl-redirect':790 '/v1alpha1':1274 '1':95,134,220,1477,1519,1589,1624 '16.4.0':1269,1314,1323,1326 '1gi':1047,1396 '2':101,190,223,1525,1628 '2.1':929 '200m':1467 '20m':1473 '256mi':1469 '25mi':1475 '3':105,209,227,1528,1634 '4':237,250,1531,1638 '443':361,363 '5':245,436,1534 '500m':1407 '50m':1413 '512mi':1409 '51mi':1415 '6':491,1545 '7':507,1390,1559 '7.2.7':1392 '8':1570 '8.0.30':1364,1374 '8.0.4':1343 '80':359 'ac':1362,1372 'ac-mysql':1361,1371 'account':1429,1437,1444 'across':734,751 'act':1848 'ad':1901 'add':458 'admin':180,874,1445 'ai':622 'align':426,831,837,850 'allow':1123,1586 'also':171 'altern':1815 'alway':397,495,1732,1734 'ambigu':1643 'analysi':73 'analyz':135 'annot':265,778 'apecloud':1368 'apecloud-mysql':1367 'api':1271,1503 'app':174,196,238,246,428,595,636,638,643,649,659,679,689,829,871,976,982,1117,1168,1487,1489,1796,1805,1915 'app-runtim':173,427 'app-scop':981,1116 'app.kubernetes.io':1286,1290,1350 'app.kubernetes.io/instance':1285,1349 'app.kubernetes.io/managed-by':1289 'app/ingress/configmap':1660 'appear':1905 'appli':251,254,437 'applic':141,463,691,725,742,814,969,1178,1222 'approv':310,1089,1106 'apps.kubeblocks.io':1273 'apps.kubeblocks.io/v1alpha1':1272 'artifact':857,968,1556,1588,1594 'ask':78,1784 'assumpt':184 'author':561 'authorit':1657,1687 'auto':1731 'automat':72 'automountserviceaccounttoken':1478 'avail':170,818,844 'avoid':923 'backend':388,635,757,1896 'backend-to-servic':387 'base':1188 'baselin':423,1454 'behavior':176,872,1752,1764 'beyond':1926 'blog':632 'bootstrap':179,465,828,873 'branch':599 'brief':1625 'broker':1443 'broker-account-admin':1442 'bullet':1697,1768 'bundl':1839 'busi':333,341,355,1076,1096,1820,1855 'business-env':1819 'categori':200,567,615 'certif':373 'check':163,816,1259,1515,1721 'check_consistency.py':1595 'chines':606 'ci':1571 'cli':1006 'cloud':1215 'cloud.sealos.io':662 'cloud.sealos.io/app-deploy-manager':661 'cluster':233,1305,1335,1353,1378,1400 'clusterdefinition.kubeblocks.io':1316 'clusterdefinition.kubeblocks.io/name:':1315 'clusterdefinitionref':1366 'clusterversion.kubeblocks.io':1320 'clusterversion.kubeblocks.io/name:':1319 'clusterversionref':1324,1370 'code':627 'command':1512 'communic':153 'complet':1622,1635 'compon':708,732,749,1401 'component-scop':707 'componentdef':1340,1383,1386 'compos':7,36,56,314,325,421,863,950,1750,1927 'compose-styl':949 'compose/docs':140,1791 'compose/docs-to-template':1724 'composit':1165 'concret':944 'condens':529 'config':44,1189,1194,1197,1204,1224 'config/default.json':1195 'configmap':710,1054,1201,1227 'configmap/secret':241 'configur':1183 'conflict':114,130,1904 'connect':1081 'connection/bootstrap':1132 'consist':1757,1829 'constraint':889,1265 'contain':42,371,681,948,973,1023,1077,1097,1202,1464,1470,1874 'contract':1618 'control':1706 'convent':1234,1661,1794 'convers':74,252,268,271,276,287,400,845,1620,1626,1671,1751 'convert':5,41,52,54,1710,1740 'coverag':1769,1779 'cpu':1406,1412,1466,1472 'cr':222,545,552 'crane':901 'creat':485,1199,1261 'creation':1254 'credenti':1007,1017 'critic':851 'current':1302,1654 'custom':470,1101,1150,1237 'data':1394 'databas':144,228,294,438,464,471,488,624,1069,1080,1091,1108,1131,1142,1238,1263,1399,1673 'database-specif':1262 'db':289,296,459,1826 'db-secret':1825 'decis':1640 'declar':1157 'dedic':1115 'default':811,958,1438,1456,1480,1483,1581,1736,1928 'defaults.app':542,987,1212,1242,1279,1425,1432,1440 'defin':695,713,822,1300 'deliv':518 'depend':151,273 'deploy':1002 'deployment/statefulset':242 'descript':199,562 'determinist':399,918,1723 'dev':630 'dev-op':629 'dev/debug':1592 'differ':864 'digest':913,937,964 'direct':346,1073 'directori':1225 'disableexport':1327 'doc':11,60,383,1418,1459,1893 'docker':2,6,35,48,55,139,1583,1663 'docker-compose.yml':23 'docker-to-sealo':1 'docs/manifests':168,412,842,861,1910 'domain':1216 'drift':94,1705 'driven':1599,1756 'drop':362 'dual':417,1878 'dual-port':1877 'dual-sourc':416 'e.g':1191 'edg':321,330,1670,1781,1840 'email/smtp/external':1502 'emit':855,966,1743,1860 'empti':1587 'emptydir':1033 'enabledlog':1329 'end':69,71 'end-to-end':68 'endpoint':300,1083 'endpoint/env/protocol':877 'endpoint/protocol':183 'endpoints/commands':834 'enforc':1699 'english':1510 'entri':1609 'entrypoint':401,1726 'enum':1816 'env':154,269,291,312,1064,1074,1094,1153,1169,1821 'env/volume':1102 'equal':667,674,684 'etc':1505 'exampl':131,293,376,908,927,955,1161,1681 'except':1105,1453,1902 'execut':67,483 'exist':413,1258,1644,1857,1911 'expans':320 'expect':810 'explicit':384,764,904,933,961,1025,1051,1419,1460 'expos':340,357,1014 'express':953 'extern':182,876 'extract':137,172 'f':47 'fail':523 'fallback':911 'fals':1479 'field':82,181,256,557,875,1082,1666,1788 'field-level':255,1665 'file':8,57,100,126,494,1187,1198,1205,1543,1554,1568,1630 'file-bas':1186 'final':316,1517 'first':526 'fix':524,1898 'float':924 'flow':188 'folder':546 'follow':89,442,1060,1166,1229,1337,1355,1380 'format':1800 'fqdn':286 'frontend':634 'game':623 'gateway':322,1845,1865 'generat':215,492,1020,1485,1725 'gh':1005 'ghcr':1010 'gitrepo':203,560 'govern':83 'grade':15,64 'guidanc':434 'hardcod':537 'health':162,185,815,878 'higher':117,885 'higher-prior':116,884 'host':302,305,1084,1213,1490 'http':772,1883 'http/https':1880 'https':386,1895 'https/certificate':1889 'i18n':566 'i18n.zh.description':600 'i18n.zh.title':608 'icon':204,503,563,584 'idempot':489 'ident':612 'ifnotpres':1028 'ignor':1918 'imag':262,890,940,974,984,1011 'imagepullpolici':1027 'implement':1249,1605 'in-contain':369,1872 'includ':261,326,554,775,1241,1307 'infer':191,193,1789,1814 'ingress':244,345,352,743,773,1837,1870 'ingress/front-proxy':1850 'init':460,475,1246 'inject':304 'input':136,1018,1482,1493 'inputs.description':1506 'instal':10,59,167,411,841,1909 'invent':1174 'job':234,476,1247 'job/initcontainer':461 'kafka':1439 'kb':597 'kb.io':1311,1346,1359 'kb.io/database':1345 'kb.io/database:':1310,1358 'keep':129,1600,1795,1804,1818,1882 'key':1055,1504,1639 'kompos':395,403,1729,1739 'kompose-mod':394,1728 'kubeblock':299,1090,1107,1136,1141 'kubeblocks-provid':1135 'kubernet':29,166,285,382,410,433,836,840,860,867,1908 'kubernetes.io':780 'kubernetes.io/ingress.class':779 'label':664,671,703,721,1233,1292,1344,1659 'labels/fields':1309 'last':248 'latest':897 'least':1853 'legaci':1449 'less':1053 'level':257,1667 'like':329 'limit':1405,1465 'limits/requests':160 'link':654,1811 'list':1694 'livenessprob':823 'load':1648,1649 'local':565,1004 'locale/i18n':206 'logic':1255 'low':626 'low-cod':625 'lower':111,124 'lower-prior':110,123 'lowercas':538 'machin':1690 'machine-read':1689 'main':1393 'manag':678,688,819,938,975,998,1836 'manual':1703 'map':258,266,1564,1668,1700,1770 'match':549,705,723,972 'may':1133 'memori':1408,1414,1468,1474 'merg':419 'metadata':192,207,532,556,1616 'metadata.labels.app':670,696,714,736 'metadata.labels.cloud.sealos.io':699,717,738,754 'metadata.labels.cloud.sealos.io/app-deploy-manager':698,716,737,753 'metadata.name':534,550,669,676,686,724,735,752 'migrat':33 'miss':81,1787 'mode':396,1730 'mongodb':1334,1341,1424,1428 'mongodb-account-root':1427 'monitor':628 'mount':374,1218,1890 'mounts/object':147 'multi':769 'multi-port':768 'must':97,119,441,450,477,527,535,548,553,570,578,586,601,616,640,646,652,666,673,683,694,704,712,722,728,745,762,774,821,846,942,946,971,978,1024,1045,1059,1078,1098,1145,1155,1228,1306,1336,1354,1379,1403,1507,1696,1767,1778,1831 'must/security':888 'mysql':1352,1363,1369,1373 'mysql/mongodb/redis/kafka':449 'name':197,279,283,455,530,543,547,682,733,750,761,988,1058,1062,1144,1171,1231,1243,1278,1280,1423,1426,1433,1441,1450,1488,1678,1714 'navig':1646 'need':39,226,236,1042,1651 'never':655,1733,1783,1801 'nginx':777 'nginx.ingress.kubernetes.io':783,786,789,792,795,798,801,804,807 'nginx.ingress.kubernetes.io/backend-protocol':791 'nginx.ingress.kubernetes.io/client-body-buffer-size':794 'nginx.ingress.kubernetes.io/configuration-snippet':806 'nginx.ingress.kubernetes.io/proxy-body-size':782 'nginx.ingress.kubernetes.io/proxy-buffer-size':797 'nginx.ingress.kubernetes.io/proxy-read-timeout':803 'nginx.ingress.kubernetes.io/proxy-send-timeout':800 'nginx.ingress.kubernetes.io/server-snippet':785 'nginx.ingress.kubernetes.io/ssl-redirect':788 'node':1193 'node-config':1192 'non':472,1068,1239,1686 'non-authorit':1685 'non-databas':1067 'noop':1332 'normal':195,323,349,648,1808 'object':1111,1822 'objectstoragebucket':224 'offici':165,201,381,409,432,502,813,833,835,839,859,866,1167,1892,1907 'offload':348 'omit':607 'one':1573,1854 'one-shot':1572 'op':631 'oper':1500 'option':1613 'orchestr':43 'order':214,219,274,1658 'originimagenam':970 'otherwis':1421,1462 'output':76,493,510,520,1617 'outsid':1451 'overview':53 'password':308,1087,1162 'passwords/keys':1492 'path':592,1615,1631,1711 'pattern':1037,1679,1683 'perform':414 'permiss':1296 'persist':1035 'pg':1245,1281 'pg-init':1244 'php':1196 'pin':263,444,914 'plan':210 'platform':1793 'plus':332 'point':587 'polici':893,1782,1828 'port':150,303,306,366,770,1085,1879,1885 'port/service/ingress':267 'postgr':473,1240 'postgresql':440,469,480,1236,1266,1268,1270,1275,1282,1293,1304,1313,1318,1322,1325 'preced':90 'predefin':619 'prefer':392,865,902,1833,1864,1897 'prefix':1175 'prevent':92 'prioriti':86,112,118,125,886 'privat':1009 'probe':186,879 'produc':496 'product':14,63 'production-grad':13,62 'progress':1647 'provid':1137,1499,1623 'proxi':331,337,1841 'public':1181,1208 'pull':892,985,993,1120 'pvc':1043,1395 'python':1520,1526,1529,1532,1535,1546,1560,1575 'random':1491 'raw':591,1015 'raw.githubusercontent.com':573,581 'raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/':572,580 'rbac':1276,1283,1675 'readabl':1691 'readi':481,1256 'readinessprob':824 'redefin':1148 'redi':1377,1384,1388,1431,1435,1436 'redis-redis-account-default':1434 'redis-sentinel':1387 'redund':1888 'refer':113,847,941,979,1104,1539,1540,1550,1551,1645,1652 'referenc':1127,1159 'references/conversion-mappings.md':106,260,1662 'references/database-templates.md':104,457,1672 'references/example-guide.md':108,1680 'references/examples':1899 'references/must-rules-map.yaml':1565,1695 'references/rules-registry.yaml':1544,1555,1569,1601,1688 'references/sealos-specs.md':102,1656 'refin':1923 'registri':992,1016,1119,1598,1607,1755,1772 'registry-driven':1597,1754 'regress':1720,1747,1760,1775 'remain':1298 'remov':368,1887 'replic':1398 'repo':590 'reproduc':405 'request':1044,1411,1471 'requir':149,385,402,448,466,555,766,776,1052,1179,1284,1297,1308,1420,1461,1577,1894 'reserv':1140 'resolv':505,898,959 'resourc':159,211,216,229,240,247,637,639,644,650,660,668,675,693,711,727,744,1152,1402,1797,1806,1863 'respons':1518 'reus':1738 'revisionhistorylimit':1476 'role':231,1294 'rolebind':232 'root':1430 'rule':85,93,98,120,253,528,1542,1553,1567,1606,1608,1701,1773,1832 'rules-fil':1541,1552,1566 'run':511,1330,1513 'runtim':175,429,852,868,997,1455,1924 'runtime-manag':996 'safe':1252 'scope':709,983,1118 'scope.include':1614 'scope/rules':1693 'script':1707 'scripts/check_consistency.py':1536,1547,1753 'scripts/check_must_coverage.py':1561,1765 'scripts/compose_to_template.py':393,1722 'scripts/path_converter.py':280,1063,1521,1709 'scripts/quality_gate.py':1576 'scripts/test_check_consistency.py':1527,1759 'scripts/test_check_must_coverage.py':1533,1774 'scripts/test_compose_to_template.py':1530,1746 'sealo':4,16,27,38,46,50,65,344,351,887,1001,1214,1585,1664,1835,1869 'sealos-deploy':1000 'sealos-manag':1834 'secret':157,454,986,994,1066,1092,1103,1109,1113,1121,1138,1143,1151,1422,1677,1827 'secretkeyref':311 'self':515,1523,1716 'self-test':514,1522,1715 'semant':430,869,1925 'sensit':1070 'sentinel':1389 'servic':142,145,152,243,282,334,342,356,390,692,726,759,771,1856,1884 'service-nam':281 'service.name':758 'serviceaccount':230 'serviceaccountnam':1333 'servicevers':1342,1391 'set':765,853,1026,1210,1582 'sever':1611 'shape':407,1742 'shot':1574 'simplifi':605 'skill':1537,1548,1562 'skill-docker-to-sealos' 'skill.md':96,1538,1549,1563 'skip':335 'slow':827 'sourc':205,418,1049,1079,1417,1458 'source-labring' 'spec':1050,1303 'spec.data.url':642,1799 'spec.displaytype':645,1807 'spec.i18n.zh.readme':577 'spec.ports':760 'spec.readme':569 'spec.selector.app':706,741 'spec.template':657,1803 'spec.type':651,1810 'specif':1264 'stabl':930 'standard':1230 'startup':1251 'startup-saf':1250 'startup/init':187 'startupprob':830 'step':133,189,208,249,435,490,506 'storag':148,275,633,1029,1036,1040,1112,1823 'strategi':439 'strict':213 'structur':447,1339,1357,1382,1676 'style':951 'summari':1627 'support':1452,1610,1718,1727 'switchpolicy.type':1331 'sync':1603 'system':1190 'tag':906,920,925,935,962 'target':487,1629,1914 'task':1655 'templat':17,30,51,66,221,452,497,499,519,533,544,551,568,576,589,856,967,1021,1557,1578,1632,1636,1674,1744 'template.spec.imagepullsecrets':990,1130 'template/rules/examples':525 'templatetyp':564 'termin':1867 'test':516,1524,1717,1748,1761,1776 'titl':198,558,614 'tls':347,372,1866,1875 'toler':1376 'tool':621 'topic-agent-skills' 'topic-ai-agent' 'topic-claude-code' 'topic-cloud-native' 'topic-codex' 'topic-deployment' 'topic-docker' 'topic-gemini-cli' 'topic-kubernetes' 'topic-sealos' 'topolog':424,1397 'traefik':328,1844,1861 'traefik-lik':327 'traffic':391 'true':1328 'truli':1496 'unavail':922 'unifi':1277 'unless':380,880,1048,1416,1457,1891 'updat':121 'upgrad':1338,1356,1381 'url':202,295,297,317,559,585,1164,1182,1209 'url/dsn':290 'usag':158 'use':18,87,420,451,541,618,641,656,729,746,896,931,1003,1032,1034,1072,1100,1134,1404,1448,1463,1802,1920 'user':20,79,1498,1785 'user-provid':1497 'usernam':307,1086 'util':1708 'v2':928 'v2.2.0':909 'valid':75,508,512,522,1511,1692,1758,1763,1766,1780 'valu':620,665,672,1075,1486,1501,1817 'valuefrom.secretkeyref':1095 'values/inputs':1071 'var':155,270,319,956,957,1154,1170 'variabl':952 'version':445,899,905,919,934,1267 'via':309,343,989,1093,1184 'violat':883 'vn':278,1061,1713 'volum':1057 'volumeclaimtempl':1038 'volumes/config':146 'vs':143,1481 'wait':478,1257 'walkthrough':1684 'want':25,31 'wildcard':1295 'without':77,1593 'workflow':132 'workload':239,338,406,680,685,690,820,939,977,1741,1862,1881 'workload/service':365 'written':603 'yaml':1637","prices":[{"id":"6aa032e9-45a7-4fc7-88bb-e2ca7b53fc20","listingId":"9dc0daab-ba6f-45e3-b6fc-0d6abd81f6cd","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"labring","category":"seakills","install_from":"skills.sh"},"createdAt":"2026-04-19T00:40:52.999Z"}],"sources":[{"listingId":"9dc0daab-ba6f-45e3-b6fc-0d6abd81f6cd","source":"github","sourceId":"labring/seakills/docker-to-sealos","sourceUrl":"https://github.com/labring/seakills/tree/main/skills/docker-to-sealos","isPrimary":false,"firstSeenAt":"2026-04-19T00:40:52.999Z","lastSeenAt":"2026-04-22T13:03:12.469Z"}],"details":{"listingId":"9dc0daab-ba6f-45e3-b6fc-0d6abd81f6cd","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"labring","slug":"docker-to-sealos","github":{"repo":"labring/seakills","stars":17,"topics":["agent-skills","ai-agent","claude-code","cloud-native","codex","deployment","docker","gemini-cli","kubernetes","sealos"],"license":null,"html_url":"https://github.com/labring/seakills","pushed_at":"2026-04-22T08:50:08Z","description":"AI agent skills for Sealos Cloud — deploy any project, provision databases, object storage & more with one command. Works with Claude Code, Gemini CLI, Codex.","skill_md_sha":"8d78c0a0ecd1453f76a965df50741e0e25041c2f","skill_md_path":"skills/docker-to-sealos/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/labring/seakills/tree/main/skills/docker-to-sealos"},"layout":"multi","source":"github","category":"seakills","frontmatter":{"name":"docker-to-sealos","description":"Convert Docker Compose files or installation docs into production-grade Sealos templates. Use when user has a docker-compose.yml and wants a Sealos or Kubernetes template, wants to migrate from Docker Compose to Sealos, needs to convert container orchestration configs to Sealos format, or mentions compose-to-template conversion. Also triggers on \"/docker-to-sealos\"."},"skills_sh_url":"https://skills.sh/labring/seakills/docker-to-sealos"},"updatedAt":"2026-04-22T13:03:12.469Z"}}