news 2026/9/9 20:47:50

Docker Compose Bridge Transformations 命令完全指南:管理 compose 到 Kubernetes/Helm 的转换镜像

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker Compose Bridge Transformations 命令完全指南:管理 compose 到 Kubernetes/Helm 的转换镜像

Docker Compose Bridge Transformations 命令完全指南:管理 compose 到 Kubernetes/Helm 的转换镜像

【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose

导读

docker compose bridge transformations是 Docker Compose CLI 中负责管理"转换器镜像(transformation images)"的命令组,它归属于 bridge 功能组,支撑着docker compose bridge convert将 Compose 项目转换为 Kubernetes manifests、Helm Chart 等其他部署模型的能力。读完本文,你将掌握 transformation 镜像的工作原理、listcreate两个子命令的全部参数与用法,以及如何从仓库源码与端到端测试中验证这一机制的行为细节。

transformations 命令组在 bridge 体系中的定位

在 Compose 的 bridge 设计里,把compose.yaml转换成"另一个模型"的过程并不是写死在 CLI 二进制里的,而是交给一个个独立的转换器镜像去执行。CLI 只负责把 Compose 项目模型序列化并喂给镜像,再由镜像产出 Kubernetes/Helm 等目标产物。transformations子命令组正是围绕这批镜像的生命周期管理而存在。

从命令入口源码可以看到,transformations是一个仅用于归组的父命令,注册了如下两个子命令:

子命令用途
list(别名ls列出本地可用的 transformation 镜像
create基于已有 transformation 创建一份新的可定制副本

官方参考文档(compose_bridge_transformations.md)为命令组本身记录了唯一的选项:

选项类型默认说明
--dry-runboolfalse以 dry-run 模式执行命令

其中--dry-run属于从父命令继承的选项(详见生成的 docker_compose_bridge_transformations.yaml),后续小节中list/create各自还能识别它。

先理解 transformation 镜像是什么:标签 + templates 目录

在动手执行listcreate之前,有必要先弄清 CLI 是如何识别"一个镜像是不是 transformation"的。答案藏在pkg/bridge/transformers.go的常量定义里:

  • TransformerLabel = "com.docker.compose.bridge":用于给镜像打标签的键;
  • DefaultTransformerImage = "docker/compose-bridge-kubernetes":默认的转换器镜像;
  • templatesPath = "/templates":转换模板在镜像内的固定目录。

也就是说,一个 transformation 镜像需要满足两点约定:

  1. 带有标签com.docker.compose.bridge=transformation
  2. 镜像内包含/templates目录,里面存放转换所用的模板文件。

而镜像真正被消费的地方在pkg/bridge/convert.goconvert函数中:CLI 会把序列化后的 Compose 项目(临时目录中的compose.yaml)以 bind mount 方式挂载为容器的/in,把输出目录挂载为/out,若用户显式传了--templates则再挂载到/templates,随后以LICENSE_AGREEMENT=true的环境变量启动该镜像并等待其运行完成,产物即被写入/out。这解释了为什么 transformation 镜像必须自带模板:转换逻辑本身运行在容器里,CLI 只负责把输入与输出目录接好

列出已安装的转换器:transformations list

list(别名ls)用于枚举本机 Docker 中所有"已安装"的 transformation 镜像。其 CLI 定义见 cmd/compose/bridge.go,官方参数表如下(文档):

选项类型默认说明
--dry-runboolfalse以 dry-run 模式执行
--formatstringtable输出格式,可选tablejson
-q,--quietboolfalse仅显示 transformer 名称

底层实现:按标签过滤镜像

命令的完整形态有两种写法,二者等价:

docker compose bridge transformations list docker compose bridge transformations ls

底层调用ListTransformers,其实质就是对 Docker daemon 执行一次带 label 过滤的ImageList查询:

docker image ls --filter label=com.docker.compose.bridge=transformation

因此凡是带com.docker.compose.bridge=transformation标签的本地镜像都会被列出,无关镜像不会出现——这也是"可用 transformation"的唯一定义。

默认 table 输出与列含义

默认(--format table)输出包含四列(格式化逻辑见 cmd/compose/bridge.go):

  • IMAGE ID:镜像 ID 的截断形式;
  • REPO:仓库名(从 RepoTags 解析出的熟悉名称);
  • TAGS:镜像标签;
  • SIZE:镜像大小(按人类可读格式展示)。

-q/--quiet则会退化为纯名称输出:优先打印RepoTags[0],无标签时才打印镜像 ID。

机器可读输出

需要脚本消费时可切换为 JSON:

docker compose bridge transformations list --format json

从 docker_compose_bridge_transformations_list.yaml 生成的默认值可以看到format的默认是table,仅在显式传入json时才切换。

一个典型的验证场景

仓库的端到端测试 pkg/e2e/bridge_test.go 展示了list的实战校验:在执行过转换后执行ls,断言标准输出中同时包含docker/compose-bridge-helmdocker/compose-bridge-kubernetes两个镜像名。这提示了 list 的最常见用途——确认本地是否已具备所需的转换器镜像,避免bridge convert时因镜像缺失触发不必要的网络拉取。

派生一份自定义转换器:transformations create

create用于"复制"一份现有的 transformation,生成一个可以修改的本地工程,便于你定制自己的转换模板。命令入口见 cmd/compose/bridge.go:

docker compose bridge transformations create [OPTION] PATH

其中PATH是必填的位置参数(源码中通过cli.ExactArgs(1)强制恰好一个参数),它指向要生成的本地工程目录。参数表如下(文档):

选项类型默认说明
--dry-runboolfalse以 dry-run 模式执行
-f,--fromstringdocker/compose-bridge-kubernetes要复制来源的已有 transformation 镜像

create 执行时实际发生什么

create的完整实现位于CreateTransformer,其行为可归纳为四个阶段:

  1. 解析来源镜像:若未传--from,自动使用默认值docker/compose-bridge-kubernetes(见 transformers.go);
  2. 校验目标目录:目标路径会被转为绝对路径,且该目录必须不存在output folder %s already exists会直接报错),随后创建templates/子目录,并校验输出路径合法性;
  3. 从来源镜像抽取模板:以来源镜像创建临时容器(结束后自动ContainerRemove(Force: true)清理),再通过CopyFromContainer把容器内的/templates目录整体拷贝到本地目标目录;
  4. 生成 Dockerfile:在目标目录写入一个默认 Dockerfile,内容为:
FROM docker/compose-bridge-transformer LABEL com.docker.compose.bridge=transformation COPY templates /templates

这个 Dockerfile 恰好回应了前文所述的两条约定:基础镜像使用官方转换器运行时docker/compose-bridge-transformer,打上com.docker.compose.bridge=transformation标签,并把本地templates目录复制回镜像内的/templates

create 之后你得到什么

假设执行:

docker compose bridge transformations create my-k8s-tweaks

工作目录my-k8s-tweaks/下会出现:

  • templates/:从docker/compose-bridge-kubernetes拷贝来的模板目录,可在此按需修改;
  • Dockerfile:上文展示的默认构建文件。

之后用docker build构建并打上标签,一个新 transformation 镜像便诞生了。不过要注意:create 本身不会自动帮你 build 镜像,它只负责生成可构建的工程骨架,最终仍需自行docker build -t <your-registry>/<name> .

注意:--dry-run需要 docker daemon 支持 dry-run 的客户端能力。从 docker_compose_bridge_transformations_create.yaml 可以看到from仅有string类型且默认值在帮助信息中说明,未传入时即回落到源码中的默认镜像。

把 transformations 接回完整的转换工作流

掌握了镜像管理之后,理解它们如何被使用才完整。docker compose bridge convert-t/--transformation选项用于指定要应用的转换器,可重复传入多个(stringArray);若完全不传,则默认使用docker/compose-bridge-kubernetes(默认值见 convert.go 与 compose_bridge_convert.md)。

仓库端到端测试 TestConvertAndTransformList 给出了一个完整可复现的工作流示例:

# 1. 转换为 Kubernetes manifests docker compose -f fixtures/bridge/compose.yaml --project-name bridge \ bridge convert --output out/kubernetes \ --transformation docker/compose-bridge-kubernetes:v0.0.3 # 2. 转换为 Helm chart docker compose -f fixtures/bridge/compose.yaml --project-name bridge \ bridge convert --output out/helm \ --transformation docker/compose-bridge-helm:v0.0.3 # 3. 核对本地已就绪的 transformation 镜像 docker compose --project-name bridge bridge transformations ls

与之对应的样例 Compose 文件是 fixtures/bridge/compose.yaml,它同时使用了configssecretsinternal网络与多网络服务,用以验证转换器的覆盖能力。转换结果可在仓库中直接比对:

  • Kubernetes 输出:fixtures/bridge/expected-kubernetes(包含base/的 namespace、configs、secrets、NetworkPolicy、Deployment、Service 与kustomization.yaml,以及overlays/desktop/覆盖层);
  • Helm 输出:fixtures/bridge/expected-helm(Chart.yamlvalues.yamltemplates/下的各资源模板)。

观察这些预期产物可以看到:命名空间、Secret/ConfigMap、网络策略、Deployment、Service 等 Kubernetes 资源均由模板体系自动推导生成,这也是默认 transformationdocker/compose-bridge-kubernetes的功能边界。测试通过diff -r对转换输出与期望目录做全量比对,说明转换结果是确定性的。

使用注意事项与限制

结合源码,使用本命令组时有几点值得留意:

  1. 依赖本地 Docker daemonlistcreate都直接调用dockerCli.Client()(见 transformers.go),因此环境必须能访问 Docker Engine;create还需要能拉取或已存在--from指定的来源镜像。
  2. 镜像缺失时不会自动兜底create依赖本地镜像执行ContainerCreate+CopyFromContainer,来源镜像不存在时命令会直接失败,需要先docker pull
  3. 目标目录必须不存在create PATH在目标已存在时会报output folder ... already exists,这是有意的保护,避免覆盖已有工程。
  4. Windows 与 Linux 行为差异:在convert阶段,POSIX 系统会把容器以当前用户 UID 运行以保证输出文件归属正确,而 Windows 上引擎无法管理 SID,因此不会设置 User 字段(见 convert.go)。这一点对你编写、测试自定义模板时同样有影响。
  5. --dry-run在文档与实现中的呈现--dry-run在参考文档中作为(父命令继承的)选项出现,但本文所述三个命令的核心实现路径并未针对 dry-run 额外分支处理;它更接近 Compose CLI 对全局 dry-run 能力的统一标注(与 alpha dry-run 能力 对齐)。实际批量脚本中建议以真实执行 + 输出校验为准。

小结与延伸阅读

docker compose bridge transformations用"镜像即转换器"的方式把 Compose 到 Kubernetes/Helm 的转换逻辑与 CLI 解耦:list通过com.docker.compose.bridge=transformation标签发现已安装的转换器,create则从已有镜像抽取/templates生成可定制的转换工程。整体机制由 pkg/bridge/transformers.go 与 pkg/bridge/convert.go 共同实现,并被 pkg/e2e/bridge_test.go 端到端验证。

如果想继续深入,建议按以下顺序阅读仓库内容:

  • 功能组总览:compose_bridge.md、compose_bridge_convert.md
  • CLI 注册代码:cmd/compose/bridge.go
  • 转换执行与资源预加载测试:pkg/bridge/convert_test.go
  • 端到端样例工程:fixtures/bridge/

【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 20:45:43

从“无标题”到高效命名:项目定义与内容拆解实操指南

项目标题: 【无标题】 项目正文: 关键词: 摘要描述: “无标题”其实是常态&#xff1a;先别急着写标题&#xff0c;先想清楚这个项目到底是什么 每次看到手头项目备注栏里写着“无标题”三个字&#xff0c;我都特别理解。我自己也干过这事儿&#xff1a;新建文件夹的时候懒得…

作者头像 李华
网站建设 2026/9/9 20:44:53

中文信息处理期末作业:报告写作与7z压缩包实操指南

简介&#xff1a;山西大学中文信息处理课程期末作业资源包&#xff0c;面向中文信息处理、自然语言处理或深度学习相关课程的学生与入门学习者&#xff0c;可作为实验设计、报告撰写和模型实现的参考。压缩包采用7z格式&#xff0c;大小约38.21MB&#xff0c;包含多份实验报告、…

作者头像 李华
网站建设 2026/9/9 20:43:39

Windows本地部署大模型:Ollama安装、私有化部署与API调用指南

说真的&#xff0c;在Windows上跑本地大模型这件事&#xff0c;我前前后后折腾了小半年。最开始是用Python写推理脚本&#xff0c;又是装PyTorch又是配CUDA&#xff0c;搞了一整天模型还没跑起来&#xff1b;后来换了Ollama&#xff0c;从安装到把模型跑起来&#xff0c;前后加…

作者头像 李华
网站建设 2026/9/9 20:41:04

Rust never类型`!`稳定:发散函数与Result<T, !>实战解析

在 Rust 里写代码时&#xff0c;大家大概率都遇到过panic!()、todo!()、unreachable!()这些宏。它们有一个共同特征&#xff1a;一旦执行&#xff0c;程序就不会继续走后面的流程了。你或许听说过&#xff0c;这类表达式的类型叫做never类型&#xff0c;写作!。名字听起来很抽象…

作者头像 李华