☰
Telepresence compose create:为远程集群服务创建容器的完整命令行指南
2026/9/29 2:30:30 网站建设 项目流程
  • 云原生
  • 开发工具
  • 微服务
  • 网络

【免费下载链接】telepresence

Local development against a remote Kubernetes or OpenShift cluster

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

telepresence compose create是 Telepresence Docker Compose 扩展体系中的一个核心命令,它在不启动容器的情况下,为 Compose 文件中声明了x-tele扩展的服务创建容器,并完成集群连接、附件(attachment)与代理网络的编排。阅读本文后,你将掌握该命令的完整用法、全部标志参数的含义与适用场景、它与telepresence compose up/down/stop的状态机关系,以及它在 Telepresence 源码中的底层实现机制。

命令概览与定位

telepresence compose系列命令本质上是docker compose的超集:它以 Docker Compose 的 CLI 定义为模板,在原有子命令之上叠加 Telepresence 的x-tele扩展处理逻辑。该命令族注册于 cmd/compose.go,其Short描述为 "Define and run multi-container applications with Telepresence and Docker",子命令由 compose.GenerateSubCommands 根据内嵌的dc-cli.json声明动态生成。

telepresence compose create对应标准 Docker Compose 的docker compose create子命令,其官方描述为"Creates containers for a service"。核心区别在于:Telepresence 版本会在调用真正的docker compose create之前,先完成以下编排工作:

  1. 解析 Compose 项目中各服务的x-tele扩展;
  2. 建立指向远程 Kubernetes/OpenShift 集群的连接(connection);
  3. 为扩展服务创建附件(attachment),包括代理、拦截、摄取或替换等行为;
  4. 改写 Compose 项目,注入teleroute网络、远程挂载卷(telemount volume)与必要的环境变量;
  5. 将改写后的 Compose 文件落盘,并把文件路径与受管卷名保存到 daemon 信息中,再执行docker compose create。

与up的最大差异在于:create只创建容器、不启动它们,因此在所有容器创建完成后,会结束任何已有的附件(attachments)。

基本用法

telepresence compose create [flags] [services]
  • [services]为可选的 Compose 服务名列表。当指定了具体服务名时,只会为这些服务创建容器;未指定时作用于 Compose 文件中声明的全部服务。
  • 从源码看,服务名列表最终会透传给真正的docker compose进程:transform.go 中runCompose以append(opts, t.config.services...)的方式追加到命令行参数末尾。
  • 通过-h, --help可查看该子命令的帮助信息。

全部标志参数详解

telepresence compose create的标志分为三组:通用 Compose 标志、create 专属标志以及 Telepresence 全局标志。以下参数声明与默认值均来自 dc-cli.json 与官方 CLI 参考文档 telepresence_compose_create.md。

Compose 标志(在telepresence compose父命令上)

标志类型说明
--env-file stringArraystringArray可选的 env 文件(可多次指定)。优先级遵循 Docker Compose 的加载规则:先应用操作系统环境变量,再加载显式指定的 env 文件,最后读取.env中的 dot-env 变量,参见 config.go 中的toProjectOptions调用链
-f, --file stringArraystringArrayCompose 配置文件(可多次指定,支持覆盖合并)
--profile stringArraystringArray要启用的 profile(可多次指定)
--project-directory stringstring指定替代的工作目录,默认值为第一个指定 Compose 文件所在路径
--project-name stringstring项目名称。若未指定,将由 Compose 依据项目目录推断

这些标志在 config.go 中以pflag.FlagSet的方式挂到父命令上,随后由createProject统一转换成传递给docker compose的参数(transform.go):包括--file、--project-name、--project-directory、--progress、--env-file与 profile 标志。

create 专属标志

标志类型说明
--buildbool在启动容器前构建镜像
--force-recreatebool即使容器配置与镜像没有变化,也强制重新创建容器
--no-buildbool即使构建是既定策略,也不构建镜像
--no-recreatebool若容器已存在则不重建;与--force-recreate互斥
--pull stringstring运行前拉取镜像的策略,取值always|missing|never|build,默认policy
--quiet-pullbool拉取镜像时不打印进度信息
--remove-orphansbool移除 Compose 文件中未定义服务的孤立容器
--scale uint32uint32将SERVICE扩展到NUM个实例;若 Compose 文件中有 scale 设置则覆盖之
-y, --yesbool对所有提示都回答 "yes",以非交互模式运行

其中--scale对应 Docker Compose 的scale类型参数,--pull的policy默认值含义是"遵循 Compose 文件中的pull_policy设置"。

需要注意,--force-recreate与--no-recreate不只是透传给 Docker 的开关,它们还直接影响 Telepresence 的改写行为。在 transform.go 的runCommand中:

  • canCreate(初始为selectsAll,即是否选中全部扩展服务)会被--no-recreate=true置为false;
  • forceRecreate直接从标志值读取。

当--force-recreate为真时,即使 daemon 信息中已保存了改写后的 Compose 文件,也会重新应用附件并重写该文件(createConfigFile),从而更新 telemount 卷集合;而canCreate为假时,若首次调用未包含全部扩展服务,会直接返回错误the initial invocation of "compose up" or "compose create" must include all extended services。

Telepresence 全局标志

标志说明
--config stringTelepresence 配置文件路径
--format string输出格式,支持json、yaml、json-stream、default,默认default
--progress string进度输出类型,取值auto、tty、plain、json、quiet,默认auto
--use string唯一标识 daemon 容器的匹配表达式

--progress非auto时会被透传为docker compose --progress参数,见 transform.go。

create 在 compose 生命周期中的位置

telepresence compose create是 docs/reference/compose.md 所描述的"状态机"中的关键一环,各命令之间的状态转换如下:

命令行为
telepresence compose up确保扩展服务处于正确状态(连接、附件、代理、容器全部就绪)
telepresence compose create与up类似,但不启动容器;所有容器创建完成后,结束任何已有附件
telepresence compose stop结束附件,但保持 Telepresence 连接——因为现有容器仍在使用由该连接支撑的teleroute网络
telepresence compose down结束附件、终止网络并退出 Telepresence
telepresence config检测项目是否已启动:是则输出扩展后的项目文件,否则输出原 Compose 文件的规范形式
telepresence quit检测是否有telepresence compose正在运行,若有则发出telepresence compose down

create的典型应用场景是"预编排":先在 CI 或脚本中以非交互方式(配合-y)把容器与网络拓扑准备好,待后续再up启动,从而把耗时的镜像拉取与容器创建步骤与启动步骤分离。

底层实现:create 的执行链

telepresence compose create的执行可拆解为三个阶段,对应源码中的三个关键函数:

1. 解析扩展与服务选择(newTransformer)

transform.go 中的newTransformer遍历项目内每个服务,若检测到x-tele扩展键(常量extensionKey = "x-tele",定义于 config.go),则调用parseServiceExtension解析为对应的扩展类型。若命令行指定了[services]而该服务不在其中,selectsAll会被置为false,后续canCreate随之变化。

2. 生成改写后的 Compose 文件(createConfigFile)

createConfigFile 的流程为:

  • 收集所有连接(connection)的集群子网,通过teleroute.FindNonConflictingSubnet为 Compose 的默认网络预分配一个不与 Kubernetes 集群子网冲突的 IPAM 子网(configureDefaultNetwork,见 transform.go);
  • applyAttachments把各附件的服务改写(代理替换、卷注入、网络挂载、环境变量)应用到项目模型上,并确保顶层x-tele扩展被序列化回项目中(transform.go);
  • 将改写后的 YAML 写入临时文件(首次,tpc-*.yaml)或覆盖 daemon 信息中已保存的 Compose 文件(重写路径,如--force-recreate);
  • 把 Compose 文件路径与 telemount 卷名列表保存进 daemon 信息(ComposeFile、ComposeVolumes),保证连接关闭时这些卷能被正确清理。

3. 透传执行 docker compose create(runCompose)

runCompose 最终调用本机docker可执行文件,执行docker compose --file <改写后的文件> [compose标志] create [create标志] [services...]。由于create不在up分支中,不会走runAttachedUp的上下文取消清理逻辑,属于"一次性的编排命令"。

这一实现也印证了官方文档对 create 的描述:"Creates containers for a service"——Telepresence 只是把容器创建前的集群编排工作全部自动化了。

实操示例

基础用法:为全部服务创建容器

telepresence compose create

仅创建指定服务,且跳过镜像构建

telepresence compose create --no-build api worker

使用显式 Compose 文件与项目名

telepresence compose -f docker-compose.yml -f docker-compose.override.yml \ --project-name myapp \ --profile debug \ create

非交互式预创建(CI 场景)

telepresence compose create -y --quiet-pull --remove-orphans

强制重建并重新应用附件

telepresence compose create --force-recreate --build

按策略拉取并扩展副本数

telepresence compose create --pull always --scale api=3

结合 x-tele 扩展理解 create 的作用对象

create真正编排的对象是 Compose 文件中声明了x-tele扩展的服务。该扩展可以出现在顶层(描述连接与挂载配置)或单个服务上(描述扩展类型),支持的扩展类型包括connect、proxy、ingest、intercept、replace、wiretap,详见 docs/reference/compose.md 的 Service Extensions 章节。例如一个典型配置:

x-tele: connections: - namespace: default services: api: x-tele: type: intercept workload: my-api

执行telepresence compose create时,Telepresence 会为api服务建立附件:共享被拦截容器的环境与卷、注入teleroute网络,并把改写后的配置交给docker compose create落地为容器。这也解释了为何 create 完成后会"结束已有附件"——容器已就绪但未运行,附件所代表的实时关联(拦截、代理)不需要在创建阶段保持。

小结

telepresence compose create在标准 Docker Compose 的create语义之上,增加了 Telepresence 的集群连接、附件编排与 Compose 文件改写能力,是 CI 预编排和"先建容器、后启服务"工作流的首选命令。掌握其标志语义(尤其是--force-recreate/--no-recreate对改写行为的双重影响)与状态机位置,即可安全地将它嵌入本地开发与自动化流水线。

  • 云原生
  • 开发工具
  • 微服务
  • 网络

【免费下载链接】telepresence

Local development against a remote Kubernetes or OpenShift cluster

项目地址:https://gitcode.com/gh_mirrors/te/telepresence
点击查看免费下载
上一篇:timeago.js终极指南:10个实用场景应用案例
下一篇:CANN ops-transformer 稀疏 MLA 反向负载均衡前置算子:aclnnSparseFlashMlaGradMetadata 接口全解析

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

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

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

立即咨询