yuvu node exec 无法进入模型运行时容器:容器名被二次拼前缀导致 container not found #1

Closed
opened 2026-09-26 17:16:50 +08:00 by xm · 3 comments
Owner

现象

$ yuvu node exec --node nas yuvu-runtime-01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb -- nvidia-smi
error: internal: container not found: yuvu-yuvu-runtime-01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb

传入真实容器名后又被拼一次 yuvu- 前缀,得到 yuvu-yuvu-runtime-<session> → not found。
代码路径:yuvuCli/internal/cli/node.go 的 nodeExec → client.ExecInstance(instanceID, ...);节点侧解析/报错来自 yuvuNode/internal/agent/dockerexec/executor.go(ErrContainerNotFound)。

影响

模型 runtime 容器(runtime_sessions.execution_container_name = yuvu-runtime-<session-id>,实例 yuvu-runtime-01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb)完全无法进入,导致:

  • 看不到 vLLM 进程与日志,拿不到 /metrics;
  • 无法在容器内跑 nvidia-smi(adapter 容器里根本没装)看 GPU 利用率/温度/降频;
  • GPU 类能力排障几乎无从下手(本次定位「吞吐 22→4 tok/s」掉速时即卡在此处)。

期望

  1. 支持按完整容器名执行:yuvu node exec --node nas --container yuvu-runtime-<id> -- nvidia-smi;
  2. 或提供 runtime 维度入口:yuvu node runtime exec <session-id> -- <cmd> / yuvu node runtime metrics <session-id>;
  3. 节点侧 managed 校验应覆盖 runtime 容器(SpecPatch 要求 yuvu.agent.managed 标签,建议确认 runtime 容器是否带该标签);
  4. 顺带把 --timeout ≤300s、--max-output ≤4MiB 的硬上限写进 yuvu node exec --help(目前只在 usage 报错里出现)。

关联

  • yuvuCore:模型冷启动超时 + runtime 不可观测(另提)
## 现象 ``` $ yuvu node exec --node nas yuvu-runtime-01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb -- nvidia-smi error: internal: container not found: yuvu-yuvu-runtime-01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb ``` 传入真实容器名后又被拼一次 `yuvu-` 前缀,得到 `yuvu-yuvu-runtime-<session>` → not found。 代码路径:`yuvuCli/internal/cli/node.go` 的 `nodeExec` → `client.ExecInstance(instanceID, ...)`;节点侧解析/报错来自 `yuvuNode/internal/agent/dockerexec/executor.go`(`ErrContainerNotFound`)。 ## 影响 模型 runtime 容器(`runtime_sessions.execution_container_name = yuvu-runtime-<session-id>`,实例 `yuvu-runtime-01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb`)**完全无法进入**,导致: - 看不到 vLLM 进程与日志,拿不到 `/metrics`; - 无法在容器内跑 `nvidia-smi`(adapter 容器里根本没装)看 GPU 利用率/温度/降频; - GPU 类能力排障几乎无从下手(本次定位「吞吐 22→4 tok/s」掉速时即卡在此处)。 ## 期望 1. 支持按**完整容器名**执行:`yuvu node exec --node nas --container yuvu-runtime-<id> -- nvidia-smi`; 2. 或提供 runtime 维度入口:`yuvu node runtime exec <session-id> -- <cmd>` / `yuvu node runtime metrics <session-id>`; 3. 节点侧 managed 校验应覆盖 runtime 容器(`SpecPatch` 要求 `yuvu.agent.managed` 标签,建议确认 runtime 容器是否带该标签); 4. 顺带把 `--timeout` ≤300s、`--max-output` ≤4MiB 的硬上限写进 `yuvu node exec --help`(目前只在 usage 报错里出现)。 ## 关联 - yuvuCore:模型冷启动超时 + runtime 不可观测(另提)
xm added the
P2
label 2026-09-30 23:41:24 +08:00
Author
Owner

✅ 复验通过并已合入 main(合并提交 88d67e1,分支 fix/cli-1 tip be394ae 保留)

门禁:lane worktree 与合并树各跑一次 make check(vendor-check + quality + shell-check + publish-scope-check + test),两次 rc=0。

反向验证(变异必红 → 还原 sha256 一致 → 复绿)

  • 变异:nodeInstanceIDFromContainer() 的单次 strings.TrimPrefix(container, "yuvu-") 改成剥两层前缀
  • 结果:--- FAIL: TestNodeExecContainerFlagStripsExactlyOnePrefix → node_exec_container_test.go:31: single-prefix strip: instance="node", want "yuvu-node"
  • 还原:sha256(internal/cli/node.go)=c2cb1f14778a20668c1678d6eb2495e37e318aad323b60c2c5c6bbd1c1645040 与变异前逐字节一致,工作树干净,复绿

请验证这几点(真机)

  1. yuvu node exec --container yuvu-runtime-01a0dce3 -- nvidia-smi 现在命中节点实例 runtime-01a0dce3(此前二次拼前缀 → container not found);
  2. --container yuvu-yuvu-node 只剥一层 → 实例 yuvu-node(不是 node);
  3. 边界:--container 与位置实例 id 互斥、非 yuvu- 前缀报错、yuvu- 空后缀报错;node exec --help/-h/-help 仍列出 300s / 4MiB 上限。
✅ 复验通过并已合入 `main`(合并提交 `88d67e1`,分支 `fix/cli-1` tip `be394ae` 保留) **门禁**:lane worktree 与合并树各跑一次 `make check`(vendor-check + quality + shell-check + publish-scope-check + test),两次 rc=0。 **反向验证(变异必红 → 还原 sha256 一致 → 复绿)** - 变异:`nodeInstanceIDFromContainer()` 的单次 `strings.TrimPrefix(container, "yuvu-")` 改成剥两层前缀 - 结果:`--- FAIL: TestNodeExecContainerFlagStripsExactlyOnePrefix` → `node_exec_container_test.go:31: single-prefix strip: instance="node", want "yuvu-node"` - 还原:`sha256(internal/cli/node.go)=c2cb1f14778a20668c1678d6eb2495e37e318aad323b60c2c5c6bbd1c1645040` 与变异前逐字节一致,工作树干净,复绿 **请验证这几点**(真机) 1. `yuvu node exec --container yuvu-runtime-01a0dce3 -- nvidia-smi` 现在命中节点实例 `runtime-01a0dce3`(此前二次拼前缀 → container not found); 2. `--container yuvu-yuvu-node` 只剥一层 → 实例 `yuvu-node`(不是 `node`); 3. 边界:`--container` 与位置实例 id 互斥、非 `yuvu-` 前缀报错、`yuvu-` 空后缀报错;`node exec --help/-h/-help` 仍列出 300s / 4MiB 上限。
Author
Owner

独立复验 + 合并完成(issue 保持 open,等真机验收)

分支 fix/cli-1 tip 8f8a07a(b 轮:新增 yuvu node runtime exec 入口,把 core 侧 runtime-<session> 实例命名映射到 CLI)→ 已合并 main = ac7130a(合并树门禁复跑亦 rc=0)。

门禁(verifier 独立复跑,yuvuCli 工作树 HEAD=8f8a07a)

$ make check
Go vendor snapshot check passed
Go format and vet checks passed
publish scope checks passed
ok  forgejo.zuixue.site/xm/yuvuCli/internal/cli  0.223s
... (全部包 ok)                                          rc=0

反向验证(回退关键映射,新测试必须红)

# runtimeInstanceIDFromSession: value = nodeRuntimeInstancePrefix + value  ->  value = value
--- FAIL: TestNodeRuntimeExecMapsSessionToRuntimeInstance
    node_exec_container_test.go:79: runtime instance = "01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb", want "runtime-01a0dce3-..."
--- FAIL: TestNodeRuntimeExecAcceptsInstanceAndContainerNames/session_id
    node_exec_container_test.go:108: runtime exec "01a0dce3" -> instance "01a0dce3", want "runtime-01a0dce3"

还原后 sha256sum internal/cli/node.go = 8a90386b7ebcd76fc09148fbaf4d6886ef7441ccf67ed51a36909d2e35ebe1f1 == git show HEAD:internal/cli/node.go ⇒ 复绿 rc=0。

请验证这几点(真机)

  1. yuvu node runtime exec <session-id> -- nvidia-smi 能真正进入模型运行时容器并返回 stdout/stderr;
  2. 三种入参等价:bare session id / runtime-<session> / yuvu-runtime-<session>;
  3. 上限生效:--timeout ≤300、--max-output ≤4194304,超出给可读错误;
  4. --help 输出含 "maximum 300" / "maximum 4194304" / "runtime exec"。
## 独立复验 + 合并完成(issue 保持 open,等真机验收) **分支** `fix/cli-1` tip `8f8a07a`(b 轮:新增 `yuvu node runtime exec` 入口,把 core 侧 `runtime-<session>` 实例命名映射到 CLI)→ 已合并 `main` = **`ac7130a`**(合并树门禁复跑亦 rc=0)。 ### 门禁(verifier 独立复跑,yuvuCli 工作树 HEAD=8f8a07a) ``` $ make check Go vendor snapshot check passed Go format and vet checks passed publish scope checks passed ok forgejo.zuixue.site/xm/yuvuCli/internal/cli 0.223s ... (全部包 ok) rc=0 ``` ### 反向验证(回退关键映射,新测试必须红) ``` # runtimeInstanceIDFromSession: value = nodeRuntimeInstancePrefix + value -> value = value --- FAIL: TestNodeRuntimeExecMapsSessionToRuntimeInstance node_exec_container_test.go:79: runtime instance = "01a0dce3-5e34-7a75-9349-d8b8ed8bf0fb", want "runtime-01a0dce3-..." --- FAIL: TestNodeRuntimeExecAcceptsInstanceAndContainerNames/session_id node_exec_container_test.go:108: runtime exec "01a0dce3" -> instance "01a0dce3", want "runtime-01a0dce3" ``` 还原后 `sha256sum internal/cli/node.go` = `8a90386b7ebcd76fc09148fbaf4d6886ef7441ccf67ed51a36909d2e35ebe1f1` == `git show HEAD:internal/cli/node.go` ⇒ 复绿 rc=0。 ### 请验证这几点(真机) 1. `yuvu node runtime exec <session-id> -- nvidia-smi` 能真正进入模型运行时容器并返回 stdout/stderr; 2. 三种入参等价:bare session id / `runtime-<session>` / `yuvu-runtime-<session>`; 3. 上限生效:`--timeout` ≤300、`--max-output` ≤4194304,超出给可读错误; 4. `--help` 输出含 "maximum 300" / "maximum 4194304" / "runtime exec"。
Author
Owner

验证结论(2026-10-04):此问题的修复已进入 yuvuCli main。CLI 现在支持 yuvu node exec --container yuvu-<name> -- <command>,并提供 yuvu node runtime exec <session-id> -- <command>;针对完整容器名解析、runtime session 映射及帮助中 timeout/output 上限的回归测试通过(go test ./internal/cli -run TestNodeExecContainer -count=1)。main 上包含该修复的 Woodpecker pipeline #37/#38 均成功。按 issue 的功能验收条件关闭。

验证结论(2026-10-04):此问题的修复已进入 yuvuCli main。CLI 现在支持 `yuvu node exec --container yuvu-<name> -- <command>`,并提供 `yuvu node runtime exec <session-id> -- <command>`;针对完整容器名解析、runtime session 映射及帮助中 timeout/output 上限的回归测试通过(`go test ./internal/cli -run TestNodeExecContainer -count=1`)。main 上包含该修复的 Woodpecker pipeline #37/#38 均成功。按 issue 的功能验收条件关闭。
xm closed this issue 2026-10-04 20:03:31 +08:00
Sign in to join this conversation.
No description provided.