{"id":"7556624d-3ac4-4c27-8f4c-6f14298422be","shortId":"Saehsy","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 (prefer square/circular icon-first assets such as app icons, favicons, or avatars; avoid rectangular wordmark/text logos)\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, prioritizing square/circular icon-first artwork and avoiding rectangular wordmark/text logos\n\nNever create:\n\n- `template/<app-name>/README.md`\n- `template/<app-name>/README_zh.md`\n\nREADME authoring is out of scope for this skill. If the Template CR requires README URLs, populate URL fields in `index.yaml` only and leave file creation to a dedicated README skill.\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 point to `https://raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/<app-name>/README.md`.\n- Template `spec.i18n.zh.readme` must point to `https://raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/<app-name>/README_zh.md`.\n- These README fields are URL references in `index.yaml` only; this skill must not create or update the referenced README files.\n- `icon` URL must point to template repo raw path for this app on `kb-0.9` branch.\n- `template/<app-name>/logo.<ext>` must use square/circular icon-first artwork (for example app icon/favicon/avatar), and must not use rectangular wordmark/text logos.\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- CronJob resources must define labels `cloud.sealos.io/cronjob`, `cronjob-launchpad-name`, and `cronjob-type`; `cloud.sealos.io/cronjob` must equal `metadata.name`, `cronjob-launchpad-name` must be `\"\"`, and `cronjob-type` must be `image`.\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`; exception: Redis `host`/`port` may use Sealos Redis Service FQDN and `6379` when the Redis secret only exposes credentials, and MongoDB connection URLs may use the Sealos MongoDB Service FQDN plus `27017` when the MongoDB secret exposes credentials only.\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 }}-mongo-mongodb-account-root` (or `${{ defaults.app_name }}-mongodb-mongodb-account-root` when the MongoDB cluster name uses `-mongodb`)\n  - Redis: `${{ defaults.app_name }}-redis-redis-account-default` (legacy `${{ defaults.app_name }}-redis-account-default` may be accepted for backward compatibility)\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\nDo not create or output README content in this skill. README generation is delegated to another skill.\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/frappe-bench.md`\n  - Frappe/ERPNext/HRMS/bench conversion patterns, init resources, idempotent site bootstrap, and common failure signatures\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 square/circular icon-first logo assets (app icon/favicon/avatar) and avoid rectangular wordmark/text logos.\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- Never create `template/<app-name>/README.md` or `template/<app-name>/README_zh.md`; only keep README URL references inside `index.yaml` when required by the template schema.\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.\n- If the project mentions Frappe, ERPNext, HRMS, or `bench`, load `references/frappe-bench.md` before generating app workloads.","tags":["docker","sealos","skills","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":["sealos-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/labring/sealos-skills/docker-to-sealos","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add labring/sealos-skills","source_repo":"https://github.com/labring/sealos-skills","install_from":"skills.sh"}},"qualityScore":"0.467","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 34 github stars · SKILL.md body (18,333 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-05-18T19:04:10.840Z","embedding":null,"createdAt":"2026-05-14T07:03:50.750Z","updatedAt":"2026-05-18T19:04:10.840Z","lastSeenAt":"2026-05-18T19:04:10.840Z","tsv":"'-0.9':685 '-1':1546,1556 '-7':1566 '/app-deploy-manager':770,807,825,846,862 '/backend-protocol':900 '/certs':396 '/client-body-buffer-size':903 '/configuration-snippet':915 '/cronjob':926,937 '/database':1528 '/database:':1493,1541 '/etc/nginx/ssl':394 '/etc/ssl':395 '/idempotent':1434 '/index.yaml':515,1768,1789,1843,1985 '/ingress.class':888 '/instance':1468,1532 '/labring-actions/templates/kb-0.9/template/':640,649 '/logo':517,688 '/managed-by':1472 '/name:':1498,1502 '/proxy-body-size':891 '/proxy-buffer-size':906 '/proxy-read-timeout':912 '/proxy-send-timeout':909 '/readme.md':537,641,2154 '/readme_zh.md':539,650,2157 '/server-snippet':894 '/ssl-redirect':897 '/v1alpha1':1455 '1':95,134,237,1687,1729,1799,1834 '16.4.0':1450,1495,1504,1507 '1gi':1189,1577 '2':101,190,240,1735,1838 '2.1':1071 '200m':1677 '20m':1683 '256mi':1679 '25mi':1685 '27017':1269 '3':105,226,244,1738,1844 '4':254,267,1741,1848 '443':378,380 '5':262,453,1744 '500m':1588 '50m':1594 '512mi':1590 '51mi':1596 '6':508,1755 '6379':1249 '7':572,1571,1769 '7.2.7':1573 '8':1780 '8.0.30':1545,1555 '8.0.4':1524 '80':376 'ac':1543,1553 'ac-mysql':1542,1552 'accept':1645 'account':1611,1619,1634,1641,1654 'across':841,858 'act':2102 'ad':2175 'add':475 'admin':180,1016,1655 'ai':729 'align':443,973,979,992 'allow':1304,1796 'also':171 'altern':2055 'alway':414,512,1972,1974 'ambigu':1853 'analysi':73 'analyz':135 'annot':282,885 'anoth':1870 'apecloud':1549 'apecloud-mysql':1548 'api':1452,1713 'app':174,196,214,255,263,445,682,698,743,745,750,756,766,786,796,971,1013,1118,1124,1298,1349,1697,1699,2036,2045,2080,2189,2216 'app-runtim':173,444 'app-scop':1123,1297 'app.kubernetes.io':1467,1471,1531 'app.kubernetes.io/instance':1466,1530 'app.kubernetes.io/managed-by':1470 'app/ingress/configmap':1887 'appear':2179 'appli':268,271,454 'applic':141,480,798,832,849,956,1111,1359,1403 'approv':327,1231,1287 'apps.kubeblocks.io':1454 'apps.kubeblocks.io/v1alpha1':1453 'artifact':999,1110,1766,1798,1804 'artwork':528,695 'ask':78,2024 'asset':211,2079 'assumpt':184 'author':541,626 'authorit':1884,1927 'auto':1971 'automat':72 'automountserviceaccounttoken':1688 'avail':170,960,986 'avatar':218 'avoid':219,530,1065,2083 'backend':405,742,864,2150 'backend-to-servic':404 'backward':1647 'base':1369 'baselin':440,1664 'behavior':176,1014,1992,2004 'bench':2211 'beyond':2200 'blog':739 'bootstrap':179,482,970,1015,1915 'branch':686 'brief':1835 'broker':1653 'broker-account-admin':1652 'bullet':1937,2008 'bundl':2093 'busi':350,358,372,1218,1277,2060,2109 'business-env':2059 'categori':200,632,722 'certif':390 'check':163,958,1440,1725,1961 'check_consistency.py':1805 'chines':713 'ci':1781 'cli':1148 'cloud':1396 'cloud.sealos.io':769,925,936 'cloud.sealos.io/app-deploy-manager':768 'cloud.sealos.io/cronjob':924,935 'cluster':250,1486,1516,1534,1559,1581,1624 'clusterdefinition.kubeblocks.io':1497 'clusterdefinition.kubeblocks.io/name:':1496 'clusterdefinitionref':1547 'clusterversion.kubeblocks.io':1501 'clusterversion.kubeblocks.io/name:':1500 'clusterversionref':1505,1551 'code':734 'command':1722 'common':1917 'communic':153 'compat':1648 'complet':1832,1845 'compon':815,839,856,1582 'component-scop':814 'componentdef':1521,1564,1567 'compos':7,36,56,331,342,438,1005,1092,1990,2201 'compose-styl':1091 'compose/docs':140,2031 'compose/docs-to-template':1964 'composit':1346 'concret':1086 'condens':594 'config':44,1370,1375,1378,1385,1405 'config/default.json':1376 'configmap':817,1196,1382,1408 'configmap/secret':258 'configur':1364 'conflict':114,130,2178 'connect':1223,1259 'connection/bootstrap':1313 'consist':1997,2069 'constraint':1031,1446 'contain':42,388,788,1090,1115,1165,1219,1278,1383,1674,1680,2128 'content':1861 'contract':1828 'control':1946 'convent':1415,1888,2034 'convers':74,269,285,288,293,304,417,987,1830,1836,1898,1909,1991 'convert':5,41,52,54,1950,1980 'coverag':2009,2019 'cpu':1587,1593,1676,1682 'cr':239,552,610,617 'crane':1043 'creat':502,535,664,1380,1442,1857,2152 'creation':565,1435 'credenti':1149,1159,1256,1275 'critic':993 'cronjob':919,928,933,942,949 'cronjob-launchpad-nam':927,941 'cronjob-typ':932,948 'current':1483,1881 'custom':487,1282,1331,1418 'data':1575 'databas':144,245,311,455,481,488,505,731,1211,1222,1233,1289,1312,1323,1419,1444,1580,1900 'database-specif':1443 'db':306,313,476,2066 'db-secret':2065 'decis':1850 'declar':1338 'dedic':568,1296 'default':918,1100,1635,1642,1666,1690,1693,1791,1976,2202 'defaults.app':607,1129,1393,1423,1460,1606,1614,1629,1637,1650 'defin':802,820,922,964,1481 'deleg':1868 'deliv':583 'depend':151,290 'deploy':1144 'deployment/statefulset':259 'descript':199,627 'determinist':416,1060,1963 'dev':737 'dev-op':736 'dev/debug':1802 'differ':1006 'digest':1055,1079,1106 'direct':363,1215 'directori':1406 'disableexport':1508 'doc':11,60,400,1599,1669,2147 'docker':2,6,35,48,55,139,1793,1890 'docker-compose.yml':23 'docker-to-sealo':1 'docs/manifests':168,429,984,1003,2184 'domain':1397 'drift':94,1945 'driven':1809,1996 'drop':379 'dual':434,2132 'dual-port':2131 'dual-sourc':433 'e.g':1372 'edg':338,347,1897,2021,2094 'email/smtp/external':1712 'emit':997,1108,1983,2114 'empti':1797 'emptydir':1175 'enabledlog':1510 'end':69,71 'end-to-end':68 'endpoint':317,1225 'endpoint/env/protocol':1019 'endpoint/protocol':183 'endpoints/commands':976 'enforc':1939 'english':1720 'entri':1819 'entrypoint':418,1966 'enum':2056 'env':154,286,308,329,1206,1216,1236,1334,1350,2061 'env/volume':1283 'equal':774,781,791,939 'erpnext':2208 'etc':1715 'exampl':131,310,393,697,1050,1069,1097,1342,1921 'except':1238,1286,1663,2176 'execut':67,500 'exist':430,1439,1854,2111,2185 'expans':337 'expect':917 'explicit':401,871,1046,1075,1103,1167,1193,1600,1670 'expos':357,374,1156,1255,1274 'express':1095 'extern':182,1018 'extract':137,172 'f':47 'fail':588 'failur':1918 'fallback':1053 'fals':1689 'favicon':216 'field':82,181,273,558,622,653,1017,1224,1893,2028 'field-level':272,1892 'file':8,57,100,126,511,564,670,1368,1379,1386,1753,1764,1778,1840 'file-bas':1367 'final':333,1727 'first':210,527,591,694,2077 'fix':589,2172 'float':1066 'flow':188 'folder':611 'follow':89,459,1202,1347,1410,1518,1536,1561 'format':2040 'fqdn':303,1247,1267 'frapp':2207 'frappe/erpnext/hrms/bench':1908 'frontend':741 'game':730 'gateway':339,2099,2119 'generat':232,509,1162,1695,1866,1965,2215 'gh':1147 'ghcr':1152 'gitrepo':203,625 'govern':83 'grade':15,64 'guidanc':451 'hardcod':602 'health':162,185,957,1020 'higher':117,1027 'higher-prior':116,1026 'host':319,322,1226,1240,1394,1700 'hrms':2209 'http':879,2137 'http/https':2134 'https':403,2149 'https/certificate':2143 'i18n':631 'i18n.zh.description':707 'i18n.zh.title':715 'icon':204,209,215,520,526,628,671,693,2076 'icon-first':208,525,692,2075 'icon/favicon/avatar':699,2081 'idempot':506,1913 'ident':719 'ifnotpres':1170 'ignor':2192 'imag':279,953,1032,1082,1116,1126,1153 'imagepullpolici':1169 'implement':1430,1815 'in-contain':386,2126 'includ':278,343,619,882,1422,1488 'index.yaml':560,658,2164 'infer':191,193,2029,2054 'ingress':261,362,369,850,880,2091,2124 'ingress/front-proxy':2104 'init':477,492,1427,1911 'inject':321 'input':136,1160,1692,1703 'inputs.description':1716 'insid':2163 'instal':10,59,167,428,983,2183 'invent':1355 'job':251,493,1428 'job/initcontainer':478 'kafka':1649 'kb':684 'kb.io':1492,1527,1540 'kb.io/database':1526 'kb.io/database:':1491,1539 'keep':129,1810,2035,2044,2058,2136,2159 'key':1197,1714,1849 'kompos':412,420,1969,1979 'kompose-mod':411,1968 'kubeblock':316,1232,1288,1317,1322 'kubeblocks-provid':1316 'kubernet':29,166,302,399,427,450,978,982,1002,1009,2182 'kubernetes.io':887 'kubernetes.io/ingress.class':886 'label':771,778,810,828,923,1414,1473,1525,1886 'labels/fields':1490 'last':265 'latest':1039 'launchpad':929,943 'least':2107 'leav':563 'legaci':1636,1659 'less':1195 'level':274,1894 'like':346 'limit':1586,1675 'limits/requests':160 'link':761,2051 'list':1934 'livenessprob':965 'load':1875,1876,2212 'local':630,1146 'locale/i18n':223 'logic':1436 'logo':222,533,706,2078,2086 'low':733 'low-cod':732 'lower':111,124 'lower-prior':110,123 'lowercas':603 'machin':1930 'machine-read':1929 'main':1574 'manag':785,795,961,1080,1117,1140,2090 'manual':1943 'map':275,283,1774,1895,1940,2010 'match':614,812,830,1114 'may':1242,1261,1314,1643 'memori':1589,1595,1678,1684 'mention':2206 'merg':436 'metadata':192,224,597,621,1826 'metadata.labels.app':777,803,821,843 'metadata.labels.cloud.sealos.io':806,824,845,861 'metadata.labels.cloud.sealos.io/app-deploy-manager':805,823,844,860 'metadata.name':599,615,776,783,793,831,842,859,940 'migrat':33 'miss':81,2027 'mode':413,1970 'mongo':1609 'mongo-mongodb-account-root':1608 'mongodb':1258,1265,1272,1515,1522,1605,1610,1617,1618,1623,1627 'mongodb-mongodb-account-root':1616 'monitor':735 'mount':391,1399,2144 'mounts/object':147 'multi':876 'multi-port':875 'must':97,119,458,467,494,592,600,613,618,635,644,662,673,689,701,708,723,747,753,759,773,780,790,801,811,819,829,835,852,869,881,921,938,945,951,963,988,1084,1088,1113,1120,1166,1187,1201,1220,1279,1326,1336,1409,1487,1517,1535,1560,1584,1717,1936,2007,2018,2071 'must/security':1030 'mysql':1533,1544,1550,1554 'mysql/mongodb/redis/kafka':466 'name':197,296,300,472,595,608,612,789,840,857,868,930,944,1130,1200,1204,1325,1352,1412,1424,1459,1461,1604,1607,1615,1625,1630,1638,1651,1660,1698,1905,1954 'navig':1873 'need':39,243,253,1184,1878 'never':534,762,1973,2023,2041,2151 'nginx':884 'nginx.ingress.kubernetes.io':890,893,896,899,902,905,908,911,914 'nginx.ingress.kubernetes.io/backend-protocol':898 'nginx.ingress.kubernetes.io/client-body-buffer-size':901 'nginx.ingress.kubernetes.io/configuration-snippet':913 'nginx.ingress.kubernetes.io/proxy-body-size':889 'nginx.ingress.kubernetes.io/proxy-buffer-size':904 'nginx.ingress.kubernetes.io/proxy-read-timeout':910 'nginx.ingress.kubernetes.io/proxy-send-timeout':907 'nginx.ingress.kubernetes.io/server-snippet':892 'nginx.ingress.kubernetes.io/ssl-redirect':895 'node':1374 'node-config':1373 'non':489,1210,1420,1926 'non-authorit':1925 'non-databas':1209 'noop':1513 'normal':195,340,366,755,2048 'object':1292,2062 'objectstoragebucket':241 'offici':165,201,398,426,449,519,955,975,977,981,1001,1008,1348,2146,2181 'offload':365 'omit':714 'one':1783,2108 'one-shot':1782 'op':738 'oper':1710 'option':1823 'orchestr':43 'order':231,236,291,1885 'originimagenam':1112 'otherwis':1602,1672 'output':76,510,575,585,1827,1859 'outsid':1661 'overview':53 'password':325,1229,1343 'passwords/keys':1702 'path':679,1825,1841,1951 'pattern':1179,1906,1910,1923 'perform':431 'permiss':1477 'persist':1177 'pg':1426,1462 'pg-init':1425 'php':1377 'pin':280,461,1056 'plan':227 'platform':2033 'plus':349,1268 'point':636,645,674 'polici':1035,2022,2068 'popul':556 'port':150,320,323,383,877,1227,1241,2133,2139 'port/service/ingress':284 'postgr':490,1421 'postgresql':457,486,497,1417,1447,1449,1451,1456,1463,1474,1485,1494,1499,1503,1506 'preced':90 'predefin':726 'prefer':206,409,1007,1044,2073,2087,2118,2171 'prefix':1356 'prevent':92 'priorit':523 'prioriti':86,112,118,125,1028 'privat':1151 'probe':186,1021 'produc':513 'product':14,63 'production-grad':13,62 'progress':1874 'project':2205 'provid':1318,1709,1833 'proxi':348,354,2095 'public':1362,1389 'pull':1034,1127,1135,1301 'pvc':1185,1576 'python':1730,1736,1739,1742,1745,1756,1770,1785 'random':1701 'raw':678,1157 'raw.githubusercontent.com':639,648 'raw.githubusercontent.com/labring-actions/templates/kb-0.9/template/':638,647 'rbac':1457,1464,1902 'readabl':1931 'readi':498,1437 'readinessprob':966 'readm':540,554,569,652,669,1860,1865,2160 'rectangular':220,531,704,2084 'redefin':1329 'redi':1239,1245,1252,1558,1565,1569,1628,1632,1633,1640 'redis-account-default':1639 'redis-redis-account-default':1631 'redis-sentinel':1568 'redund':2142 'refer':113,656,989,1083,1121,1285,1749,1750,1760,1761,1872,1879,2162 'referenc':668,1308,1340 'references/conversion-mappings.md':106,277,1889 'references/database-templates.md':104,474,1899 'references/example-guide.md':108,1920 'references/examples':2173 'references/frappe-bench.md':1907,2213 'references/must-rules-map.yaml':1775,1935 'references/rules-registry.yaml':1754,1765,1779,1811,1928 'references/sealos-specs.md':102,1883 'refin':2197 'registri':1134,1158,1300,1808,1817,1995,2012 'registry-driven':1807,1994 'regress':1960,1987,2000,2015 'remain':1479 'remov':385,2141 'replic':1579 'repo':677 'reproduc':422 'request':1186,1592,1681 'requir':149,402,419,465,483,553,620,873,883,1194,1360,1465,1478,1489,1601,1671,1787,2148,2166 'reserv':1321 'resolv':522,1040,1101 'resourc':159,228,233,246,257,264,744,746,751,757,767,775,782,800,818,834,851,920,1333,1583,1912,2037,2046,2117 'respons':1728 'reus':1978 'revisionhistorylimit':1686 'role':248,1475 'rolebind':249 'root':1612,1620 'rule':85,93,98,120,270,593,1752,1763,1777,1816,1818,1941,2013,2072 'rules-fil':1751,1762,1776 'run':576,1511,1723 'runtim':175,446,994,1010,1139,1665,2198 'runtime-manag':1138 'safe':1433 'schema':2170 'scope':545,816,1125,1299 'scope.include':1824 'scope/rules':1933 'script':1947 'scripts/check_consistency.py':1746,1757,1993 'scripts/check_must_coverage.py':1771,2005 'scripts/compose_to_template.py':410,1962 'scripts/path_converter.py':297,1205,1731,1949 'scripts/quality_gate.py':1786 'scripts/test_check_consistency.py':1737,1999 'scripts/test_check_must_coverage.py':1743,2014 'scripts/test_compose_to_template.py':1740,1986 'sealo':4,16,27,38,46,50,65,361,368,1029,1143,1244,1264,1395,1795,1891,2089,2123 'sealos-deploy':1142 'sealos-manag':2088 'secret':157,471,1128,1136,1208,1234,1253,1273,1284,1290,1294,1302,1319,1324,1332,1603,1904,2067 'secretkeyref':328 'self':580,1733,1956 'self-test':579,1732,1955 'semant':447,1011,2199 'sensit':1212 'sentinel':1570 'servic':142,145,152,260,299,351,359,373,407,799,833,866,878,1246,1266,2110,2138 'service-nam':298 'service.name':865 'serviceaccount':247 'serviceaccountnam':1514 'servicevers':1523,1572 'set':872,995,1168,1391,1792 'sever':1821 'shape':424,1982 'shot':1784 'signatur':1919 'simplifi':712 'site':1914 'skill':548,570,661,1747,1758,1772,1864,1871 'skill-docker-to-sealos' 'skill.md':96,1748,1759,1773 'skip':352 'slow':969 'sourc':205,435,1191,1221,1598,1668 'source-labring' 'spec':1192,1484 'spec.data.url':749,2039 'spec.displaytype':752,2047 'spec.i18n.zh.readme':643 'spec.ports':867 'spec.readme':634 'spec.selector.app':813,848 'spec.template':764,2043 'spec.type':758,2050 'specif':1445 'square/circular':207,524,691,2074 'stabl':1072 'standard':1411 'startup':1432 'startup-saf':1431 'startup/init':187 'startupprob':972 'step':133,189,225,266,452,507,571 'storag':148,292,740,1171,1178,1182,1293,2063 'strategi':456 'strict':230 'structur':464,1520,1538,1563,1903 'style':1093 'summari':1837 'support':1662,1820,1958,1967 'switchpolicy.type':1512 'sync':1813 'system':1371 'tag':1048,1062,1067,1077,1104 'target':504,1839,2188 'task':1882 'templat':17,30,51,66,238,469,514,516,536,538,551,584,598,609,616,633,642,676,687,998,1109,1163,1767,1788,1842,1846,1901,1984,2153,2156,2169 'template.spec.imagepullsecrets':1132,1311 'template/rules/examples':590 'templatetyp':629 'termin':2121 'test':581,1734,1957,1988,2001,2016 'titl':198,623,721 'tls':364,389,2120,2129 'toler':1557 'tool':728 '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':441,1578 'traefik':345,2098,2115 'traefik-lik':344 'traffic':408 'true':1509 'truli':1706 'type':934,950 'unavail':1064 'unifi':1458 'unless':397,1022,1190,1597,1667,2145 'updat':121,666 'upgrad':1519,1537,1562 'url':202,312,314,334,555,557,624,655,672,1260,1345,1363,1390,2161 'url/dsn':307 'usag':158 'use':18,87,437,468,606,690,703,725,748,763,836,853,1038,1073,1145,1174,1176,1214,1243,1262,1281,1315,1585,1626,1658,1673,2042,2194 'user':20,79,1708,2025 'user-provid':1707 'usernam':324,1228 'util':1948 'v2':1070 'v2.2.0':1051 'valid':75,573,577,587,1721,1932,1998,2003,2006,2020 'valu':727,772,779,1217,1696,1711,2057 'valuefrom.secretkeyref':1237 'values/inputs':1213 'var':155,287,336,1098,1099,1335,1351 'variabl':1094 'version':462,1041,1047,1061,1076,1448 'via':326,360,1131,1235,1365 'violat':1025 'vn':295,1203,1953 'volum':1199 'volumeclaimtempl':1180 'volumes/config':146 'vs':143,1691 'wait':495,1438 'walkthrough':1924 'want':25,31 'wildcard':1476 'without':77,1803 'wordmark/text':221,532,705,2085 'workflow':132 'workload':256,355,423,787,792,797,962,1081,1119,1981,2116,2135,2217 'workload/service':382 'written':710 'yaml':1847","prices":[{"id":"bb6872cb-3e34-4d7f-979b-b4cd97f231c0","listingId":"7556624d-3ac4-4c27-8f4c-6f14298422be","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"labring","category":"sealos-skills","install_from":"skills.sh"},"createdAt":"2026-05-14T07:03:50.750Z"}],"sources":[{"listingId":"7556624d-3ac4-4c27-8f4c-6f14298422be","source":"github","sourceId":"labring/sealos-skills/docker-to-sealos","sourceUrl":"https://github.com/labring/sealos-skills/tree/main/skills/docker-to-sealos","isPrimary":false,"firstSeenAt":"2026-05-14T07:03:50.750Z","lastSeenAt":"2026-05-18T19:04:10.840Z"}],"details":{"listingId":"7556624d-3ac4-4c27-8f4c-6f14298422be","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/sealos-skills","stars":34,"topics":["agent-skills","ai-agent","claude-code","cloud-native","codex","deployment","docker","gemini-cli","kubernetes","sealos"],"license":null,"html_url":"https://github.com/labring/sealos-skills","pushed_at":"2026-05-14T09:39:17Z","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":"aa6d0a8aeb00ad2bff0517bad8119a32336e42ca","skill_md_path":"skills/docker-to-sealos/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/labring/sealos-skills/tree/main/skills/docker-to-sealos"},"layout":"multi","source":"github","category":"sealos-skills","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/sealos-skills/docker-to-sealos"},"updatedAt":"2026-05-18T19:04:10.840Z"}}