Summary
使用 CubeSandbox Go SDK 调用 Commands().Run() 执行 npm install 命令时必现 invalid_argument: protocol error: promised 577794671 bytes in enveloped message, got 197 bytes 协议解析错误。沙盒本身创建成功,命令也被 Cubelet 启动,但 SDK 客户端在读取 process.Process/Start 的 Connect stream 响应时失败。
Environment
- CubeSandbox version / commit: v0.5.0
- Go SDK version:
github.com/tencentcloud/CubeSandbox/sdk/go v0.0.0-20260712092126-8b835b07834b
- Host OS and kernel version: OpenCloudOS 9 /
6.6.69-opencloudos9.cubesandbox.pvm.host-gb85200d80fa2
- KVM info (
modinfo kvm): 见下方输出
- Deployment mode: single-node(one-click 部署)
- Relevant component: CubeProxy / envd / Cubelet / cube-egress / PVM kernel
运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1389dbff6d8 cube-sandbox-cn.tencentcloudcr.com/cube-sandbox/cube-egress:v0.4.0 "/usr/local/openrest…" 2 days ago Up 2 days cube-egress
4c0b9d1fb9e8 cube-sandbox-image.tencentcloudcr.com/opensource/openresty:1.21.4.1-6-alpine-fat "/usr/local/openrest…" 2 days ago Up 2 days (healthy) 0.0.0.0:12088->80/tcp cube-webui
f999402c46b9 cube-proxy:one-click "/usr/local/openrest…" 2 days ago Up 2 days cube-proxy
7c7032ca67ed cube-sandbox-image.tencentcloudcr.com/opensource/redis:7-alpine "docker-entrypoint.s…" 2 days ago Up 2 days (healthy) 127.0.0.1:6379->6379/tcp cube-sandbox-redis
8181c70fa608 cube-sandbox-image.tencentcloudcr.com/opensource/mysql:8.0 "docker-entrypoint.s…" 2 days ago Up 2 days (healthy) 127.0.0.1:3306->3306/tcp, 33060/tcp cube-sandbox-mysql
0e6d4594bc90 cube-sandbox-image.tencentcloudcr.com/opensource/coredns/coredns:1.14.2 "/coredns -conf /etc…" 2 days ago Up 2 days cube-proxy-coredns
modinfo kvm
filename: /lib/modules/6.6.69-opencloudos9.cubesandbox.pvm.host-gb85200d80fa2/kernel/arch/x86/kvm/kvm.ko
license: GPL
author: Qumranet
srcversion: EDE4CCFC908293516155698
depends: irqbypass,kmem_cache
intree: Y
name: kvm
vermagic: 6.6.69-opencloudos9.cubesandbox.pvm.host-gb85200d80fa2 SMP preempt mod_unload modversions
...
Steps to Reproduce
- 使用 one-click 方式部署 CubeSandbox v0.5.0。
- 使用 CubeSandbox Go SDK 创建 sandbox(模板内置 npm/node 环境)。
- 通过
Sandbox.Commands().Run() 执行以下命令:
npm install -g bl --silent --no-progress --no-audit --no-fund --loglevel error > /tmp/npm-install.log 2>&1
- SDK 内部向 envd 发起
POST /process.Process/Start(Content-Type: application/connect+json)。
- 调用必现返回错误。
最小复现代码(基于 Go SDK):
package main
import (
"context"
"fmt"
"log"
"time"
cubesandbox "github.com/tencentcloud/CubeSandbox/sdk/go"
)
func main() {
ctx := context.Background()
client := cubesandbox.NewClient(cubesandbox.Config{
APIURL: "http://<cube-api>:3000",
TemplateID: "<template-id>",
ProxyScheme: "http",
ProxyNodeIP: "<cube-proxy-ip>",
ProxyPortHTTP: 80,
SandboxDomain: "cube.app",
RequestTimeout: 60 * time.Second,
})
if err := client.Create(ctx); err != nil {
log.Fatal(err)
}
sb, err := client.Create(ctx, cubesandbox.CreateOptions{
Timeout: cubesandbox.DurationPtr(5 * time.Minute),
})
if err != nil {
log.Fatal(err)
}
defer sb.Kill(ctx)
result, err := sb.Commands().Run(ctx,
"npm install -g bl --silent --no-progress --no-audit --no-fund --loglevel error > /tmp/npm-install.log 2>&1",
cubesandbox.CommandOptions{Timeout: 2 * time.Minute},
)
fmt.Printf("result=%+v err=%v\n", result, err)
}
Expected Behavior
命令正常执行,SDK 返回 CommandResult,其中 ExitCode 为 0,Stdout/Stderr 为空(已被重定向到沙盒内文件)。
Actual Behavior
SDK 在发起 POST /process.Process/Start 后返回协议层错误:
err = (error [errors.errorString]) invalid_argument: protocol error: promised 577794671 bytes in enveloped message, got 197 bytes
沙盒侧日志显示 sandbox 创建成功、命令也确实被启动,关键日志如下:
615 info create req start
616 info load spec finish at:0
616 info shim pid 1945554
616 info snapshot restore init using snapshot_base:/usr/local/services/cubetoolbox/cube-snapshot/cubebox/tpl-6bfdd8411f024a0e9e55745c, memory_vol_url:file:///data/cubelet/storage/cubecow-reflink/volumes/tpl-tpl-6bfdd8411f024a0e9e55745c-memory/tpl-tpl-6bfdd8411f024a0e9e55745c-memory
616 info start vm start
618 info snapshot dir:file:///usr/local/services/cubetoolbox/cube-snapshot/cubebox/tpl-6bfdd8411f024a0e9e55745c/2C2000M/snapshot
642 info agent is ready
648 info found pmem:Pmem { file: "/usr/local/services/cubetoolbox/cubebox_os_image/rfs-be19f82093bcdf47413b1ce0/rfs-be19f82093bcdf47413b1ce0.ext4", discard_writes: true, source_dir: "/", fs_type: "ext4", size: Some(1073741824), id: "pmem-cubebox-image-0", placeholder: false }
650 info start sandbox finish at:34
651 info {"msg":"receive create sandbox","level":"INFO","ts":"2026-07-13T02:37:46.645728134Z"}
651 info {"msg":"create sandbox!, add storage:0ms","level":"INFO","ts":"2026-07-13T02:37:46.645824831Z"}
653 info exec a child process
656 info {"msg":"[cube-strace]recv create container","level":"INFO","ts":"2026-07-13T02:37:46.648201547Z"}
656 info {"msg":"create container by restore","level":"INFO","ts":"2026-07-13T02:37:46.648532483Z"}
661 info exec process start
664 info start container finish at:49
664 info create req finish
666 info start request, id:9024ae55592841f88dfb68671ca36e6a, execid:
666 info wait req start, id:9024ae55592841f88dfb68671ca36e6a, execid:
666 info starting log forwarding for container:9024ae55592841f88dfb68671ca36e6a stdout:stdout stderr:stderr
667 info start req finish
667 info wait process start
667 info forward init log stderr start
667 info forward init log stdout start
668 info {"msg":"wait process","level":"INFO","ts":"2026-07-13T02:37:46.663076597Z","exec-id":"","container-id":"tpl-6bfdd8411f024a0e9e55745c_0"}
668 info {"msg":"cid tpl-6bfdd8411f024a0e9e55745c_0 eid waiting for exit signal","level":"INFO","ts":"2026-07-13T02:37:46.663205561Z"}
686 info update req start, id:9024ae55592841f88dfb68671ca36e6a
688 info update req finish
081 info [ 10.269123] clocksource: Long readout interval, skipping watchdog check: cs_nsec: 237279031362047 wd_nsec: 512831117
Additional Context
- 该错误在 CubeSandbox v0.5.0 + OpenCloudOS 9 + one-click 部署上必现。
- 已尝试将
npm install 的 stdout/stderr 重定向到沙盒内文件 /tmp/npm-install.log,以避免大量输出经过 Connect stream,但协议错误仍然出现。
- 已升级 Go SDK 到最新 pseudo-version
v0.0.0-20260712092126-8b835b07834b,问题依旧。
- 沙盒侧日志显示 sandbox 创建成功、命令进程已启动、日志转发也已启动,因此问题大概率不在命令执行本身,而在 cube-proxy → envd 的 Connect stream 响应回传路径,或宿主/PVM 内核时间源异常导致 stream/超时异常。
- 升级路径:通过官方
install.sh 从 CubeSandbox v0.4.0 升级到 v0.5.0,但 PVM 宿主机内核未升级。
- 注意到部署环境中
cube-egress 容器版本仍为 v0.4.0,与 CubeSandbox v0.5.0 不一致;PVM 内核版本为 6.6.69-opencloudos9.cubesandbox.pvm.host-gb85200d80fa2,同样可能不是 v0.5.0 推荐版本。怀疑 install.sh 的升级流程没有完整升级所有组件(尤其是 cube-egress 和 PVM 内核),导致 v0.5.0 数据面/网络/时间源特性与旧组件不兼容。
- 相关
system_configs 配置示例:
cubesandbox.endpoint: http://<cube-api>:3000
cubesandbox.sandbox_domain: cube.app
cubesandbox.proxy_scheme: http
cubesandbox.proxy_node_ip: <cube-proxy-ip>
cubesandbox.proxy_port_http: 80
Summary
使用 CubeSandbox Go SDK 调用
Commands().Run()执行npm install命令时必现invalid_argument: protocol error: promised 577794671 bytes in enveloped message, got 197 bytes协议解析错误。沙盒本身创建成功,命令也被 Cubelet 启动,但 SDK 客户端在读取process.Process/Start的 Connect stream 响应时失败。Environment
github.com/tencentcloud/CubeSandbox/sdk/go v0.0.0-20260712092126-8b835b07834b6.6.69-opencloudos9.cubesandbox.pvm.host-gb85200d80fa2modinfo kvm): 见下方输出运行中的容器
modinfo kvm
Steps to Reproduce
Sandbox.Commands().Run()执行以下命令:POST /process.Process/Start(Content-Type:application/connect+json)。最小复现代码(基于 Go SDK):
Expected Behavior
命令正常执行,SDK 返回
CommandResult,其中ExitCode为 0,Stdout/Stderr为空(已被重定向到沙盒内文件)。Actual Behavior
SDK 在发起
POST /process.Process/Start后返回协议层错误:沙盒侧日志显示 sandbox 创建成功、命令也确实被启动,关键日志如下:
Additional Context
npm install的 stdout/stderr 重定向到沙盒内文件/tmp/npm-install.log,以避免大量输出经过 Connect stream,但协议错误仍然出现。v0.0.0-20260712092126-8b835b07834b,问题依旧。install.sh从 CubeSandbox v0.4.0 升级到 v0.5.0,但 PVM 宿主机内核未升级。cube-egress容器版本仍为v0.4.0,与 CubeSandboxv0.5.0不一致;PVM 内核版本为6.6.69-opencloudos9.cubesandbox.pvm.host-gb85200d80fa2,同样可能不是 v0.5.0 推荐版本。怀疑install.sh的升级流程没有完整升级所有组件(尤其是cube-egress和 PVM 内核),导致 v0.5.0 数据面/网络/时间源特性与旧组件不兼容。system_configs配置示例:cubesandbox.endpoint:http://<cube-api>:3000cubesandbox.sandbox_domain:cube.appcubesandbox.proxy_scheme:httpcubesandbox.proxy_node_ip:<cube-proxy-ip>cubesandbox.proxy_port_http:80