Kompose 入门指南:一行命令将 Docker Compose 转换为 Kubernetes
2026/9/24 15:47:31 网站建设 项目流程
  • 云原生
  • Kubernetes
  • 容器编排
  • 开发工具
  • CLI

【免费下载链接】kompose

Convert Compose to Kubernetes

项目地址:https://gitcode.com/gh_mirrors/ko/kompose
点击查看免费下载

Kompose(Kubernetes + Compose)是 Kubernetes 生态中的 Compose 转换工具,可以把docker-compose.yaml一键转换为 Kubernetes 或 OpenShift 资源清单。本文将带你从安装、转换到部署走通完整流程,并结合仓库源码讲解其 Loader–Transformer–Outputter 三阶段架构与kompose convert的底层原理,让你既能上手实操,也能理解转换背后的设计。

什么是 Kompose?

Kompose 是一款面向容器编排平台(Kubernetes 或 OpenShift)的 Compose 转换工具。它接收一份符合 Compose 规范的文件,将其翻译为 Kubernetes 资源对象。项目 README 中的定位描述为:

kompose是一个帮助熟悉docker-compose的用户迁移到 Kubernetes 的工具,它读取 Compose 规范文件并将其翻译为 Kubernetes 资源。

这种转换非常适合从本地 Compose 环境迁移到 Kubernetes 的场景:转换结果可能并不与原始 Compose 完全等价,但对于在 Kubernetes 上首次部署应用而言,它能极大降低迁移成本。开发者喜爱它的核心原因有两个:

  • 先用 Compose 简化开发流程,再把容器部署到生产集群;
  • 一条命令kompose convert即可完成转换。

It's as simple as 1-2-3:三步完成部署

官方首页给出了极简的三步走流程,这也是 Kompose 的核心使用范式:

  1. 准备一份示例docker-compose.yaml文件(或使用你自己的 Compose 文件);
  2. 执行kompose convert生成 Kubernetes 资源清单;
  3. 执行kubectl apply,然后在集群中检查新部署的容器。

完整的命令序列如下:

$ wget https://raw.githubusercontent.com/kubernetes/kompose/master/examples/docker-compose-v3.yaml -O docker-compose.yaml $ kompose convert $ kubectl apply -f . $ kubectl get po NAME READY STATUS RESTARTS AGE frontend-591253677-5t038 1/1 Running 0 10s redis-master-2410703502-9hshf 1/1 Running 0 10s redis-replica-4049176185-hr1lr 1/1 Running 0 10s

从输出可以看到,kompose convert把 Compose 中的每个服务分别生成为 Deployment 和 Service 两类资源,kubectl apply -f .一次性应用当前目录下的全部清单文件后,Pod 随即进入 Running 状态。

如果你希望获得更详细的实战指引,可以参考仓库中的 Getting Started 指南,其中覆盖了 Minikube、Minishift 与 RHEL 三种环境下的完整部署过程。

在 Linux、macOS 或 Windows 上安装 Kompose

安装 Kompose 最直接的方式是下载官方发布的二进制文件:

# Linux curl -L https://github.com/kubernetes/kompose/releases/download/v1.25.0/kompose-linux-amd64 -o kompose # macOS curl -L https://github.com/kubernetes/kompose/releases/download/v1.25.0/kompose-darwin-amd64 -o kompose chmod +x kompose sudo mv ./kompose /usr/local/bin/kompose

Windows 用户则下载kompose-windows-amd64.exe后,将二进制所在目录加入 PATH 即可。

注意:上表二进制版本以仓库文档中记录的 v1.25.0 为例。发布节奏为约三周一个版本,安装时建议到 release 页面获取最新版本号并替换 URL 中的版本号。

除二进制安装外,仓库 安装文档 还整理了更多安装途径,包括:

  • Go 安装go install github.com/kubernetes/kompose@latest(拉取 main 分支的最新开发代码);
  • CentOS:启用 EPEL 仓库后执行sudo yum -y install kompose
  • macOSbrew install kompose(Homebrew)或 MacPorts;
  • Windowschoco install kubernetes-kompose(Chocolatey)或winget install Kubernetes.kompose
  • Docker/Podman 镜像方式docker build -t kompose https://github.com/kubernetes/kompose.git#main构建后,用docker run --rm -it -v $PWD:/opt -w /opt kompose kompose convert挂载当前目录运行。

kompose convert 的底层原理:Loader → Transformer → Outputter

kompose convert并非魔法,它背后是一套清晰的三阶段流水线。仓库 架构文档 明确说明 Kompose 包含三个阶段:Loader(加载器)、Transformer(转换器)和 Outputter(输出器),每个阶段都有定义良好的接口,便于后续扩展新的加载格式或目标平台。

阶段一:Loader 读取输入文件

Loader 负责读取输入文件(当前支持 Compose 规范),并将其转换为 Kompose 内部的统一数据结构KomposeObject。接口定义如下:

// pkg/loader/loader.go type Loader interface { LoadFile(files []string, profiles []string, noInterpolate bool) (kobject.KomposeObject, error) }

KomposeObject是 Kompose 对容器编排意图的抽象表示,核心结构(源码位于 pkg/kobject/kobject.go):

type KomposeObject struct { ServiceConfigs map[string]ServiceConfig } type ServiceConfig struct { ContainerName string Image string Environment []EnvVar Port []Ports Command []string WorkingDir string Args []string Volumes []string Network []string Labels map[string]string Annotations map[string]string CapAdd []string CapDrop []string Entrypoint []string Expose []string Privileged bool Restart string User string }

从源码结构可以看出,Compose 文件中的imageportscommandvolumeslabelsenvironment等字段都会被解析并映射到ServiceConfig的对应字段上。

阶段二:Transformer 生成目标平台对象

Transformer 接收KomposeObject,将其转换为目标平台(Kubernetes 或 OpenShift)的对象。接口定义:

// pkg/transformer/transformer.go type Transformer interface { Transform(kobject.KomposeObject, kobject.ConvertOptions) ([]runtime.Object, error) }

在 pkg/app/app.go 的getTransformer中,根据--provider参数选择实现:默认 provider 使用kubernetes.Kubernetes,OpenShift 实现openshift.OpenShift内嵌(继承)了 Kubernetes 转换器。OpenShift 转换器会在 Kubernetes 资源基础上额外生成 DeploymentConfig 与 ImageStream 等 OpenShift 特有对象。

阶段三:Outputter 输出结果

Outputter 对 Transformer 的产出执行最终动作:可以打印到 stdout,也可以写为 YAML/JSON 文件。在 pkg/app/app.go 的Convert主流程中,转换完成后调用kubernetes.PrintList(objects, opt)完成输出。

一条命令背后的完整调用链

汇总 main.go、cmd/root.go 与 cmd/convert.go 的源码,kompose convert的实际执行链为:

  1. main.go调用cmd.Execute(),进入 cobra 命令框架;
  2. cmd/root.goPersistentPreRun校验 provider 必须是kubernetesopenshift(默认kubernetes),并处理--verbose--suppress-warnings等全局参数;
  3. cmd/convert.goPreRun组装kobject.ConvertOptions,调用app.ValidateFlagsapp.ValidateComposeFile做参数与输入文件校验——若未指定-f,则依次探测compose.yamlcompose.ymldocker-compose.yamldocker-compose.yml(见 pkg/app/app.go 的DefaultComposeFiles);
  4. Run调用app.Convert(ConvertOpt)依次执行 Loader 加载、Transformer 转换与 PrintList 输出。

常用命令参数与输出格式

kompose convert支持丰富的参数,下面整理自 cmd/convert.go 的命令行定义:

参数说明默认值
-f, --file指定 Compose 文件(全局参数,可多次指定实现多文件合并)无(自动探测默认文件名)
--provider目标平台,kubernetesopenshift(全局参数)kubernetes
-o, --out指定输出文件名或目录当前目录
--stdout将转换结果打印到标准输出false
-j, --json输出 JSON 格式false
-y, --yaml输出 YAML 格式(当前默认格式,已标记为废弃)true
--controller输出控制器类型:deploymentdaemonSetreplicationControllerdeployment
--replicas生成资源规格中的副本数1
--volumes卷类型:persistentVolumeClaimemptyDirhostPathconfigMappersistentVolumeClaim
--pvc-request-size指定 PVC 存储请求大小
-n, --namespace指定生成资源的命名空间
--generate-network-policies是否生成 NetworkPolicyfalse
--with-kompose-annotation是否在生成资源上添加 kompose 注解true
--no-interpolate保留 Compose 文件中的环境变量名(不做插值)false
--profile指定要使用的 profile,可多次使用
-v, --verbose详细输出(调试日志)false
--indent生成 YAML 的缩进空格数2

一些值得注意的使用要点:

  • 多文件输入kompose -f first.yaml -f second.yaml convert可合并多个 Compose 文件;
  • 输出到 stdoutkompose convert --stdout便于管道处理,且与--out互斥(源码 pkg/app/app.go 有显式校验);
  • 控制器选择--deployment--daemon-set--replication-controller等旧参数已标记废弃,官方推荐使用--controller统一指定;
  • Kubernetes 与 OpenShift 参数隔离--chart--controller等为 Kubernetes 专属,--build-repo--build-branch--deployment-config等为 OpenShift 专属,混用会直接报错(见ValidateFlags的 provider 分支校验);
  • 版本兼容:转换仅支持 Compose v1/v2 输入,未指定文件时使用DefaultComposeFiles中列出的默认文件名。

结合仓库示例文件实战

仓库 examples/compose.yaml 提供了一个包含三个服务(redis-leader、redis-replica、web)的示例 Compose 文件。直接运行转换即可得到 6 个清单文件:

$ kompose convert INFO Kubernetes file "frontend-service.yaml" created INFO Kubernetes file "redis-leader-service.yaml" created INFO Kubernetes file "redis-replica-service.yaml" created INFO Kubernetes file "frontend-deployment.yaml" created INFO Kubernetes file "redis-leader-deployment.yaml" created INFO Kubernetes file "redis-replica-deployment.yaml" created

(注:示例 Compose 中实际服务名为 redis-leader、redis-replica、web,仓库文档中输出示例沿用了旧版 frontend 命名,实际文件名以你本机运行结果为准。)

如果你倾向 OpenShift 平台,则改用kompose convert --provider=openshift,输出中会额外生成*-deploymentconfig.yaml*-imagestream.yaml文件,转换后同样可以用kubectl apply部署到 OpenShift 集群。另外仓库 script/test/fixtures 目录下存放了大量输入/输出配对用例(覆盖 volumes、configmap、secrets、cronjob、hpa、statefulset 等场景),是了解各类 Compose 特性转换行为的最佳参考素材。

总结

Kompose 的价值在于打通了「Compose 本地开发」与「Kubernetes 生产部署」之间的鸿沟。通过kompose convert这一条命令,开发者可以快速获得可部署的 Kubernetes 清单;而理解其 Loader–Transformer–Outputter 的分层设计,则有助于你在遇到转换不符合预期时,顺着 pkg/loader 与 pkg/transformer 的源码定位问题根源。进一步的深入资料可参考仓库中的 架构文档、转换文档 与 用户指南。

  • 云原生
  • Kubernetes
  • 容器编排
  • 开发工具
  • CLI

【免费下载链接】kompose

Convert Compose to Kubernetes

项目地址:https://gitcode.com/gh_mirrors/ko/kompose
点击查看免费下载
上一篇:终极指南:如何在Mac上快速免费备份你的微信聊天记录
下一篇:如何将Windows电脑变成免费无线热点:VirtualRouter完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询