Skip to content

[Bug Report]Using CubeSandbox Go SDK to call Commands().Run() to execute npm install command will always appear invalid_argument: protocol error #936

Description

@StudyNoWeekend

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

  1. 使用 one-click 方式部署 CubeSandbox v0.5.0。
  2. 使用 CubeSandbox Go SDK 创建 sandbox(模板内置 npm/node 环境)。
  3. 通过 Sandbox.Commands().Run() 执行以下命令:
    npm install -g bl --silent --no-progress --no-audit --no-fund --loglevel error > /tmp/npm-install.log 2>&1
  4. SDK 内部向 envd 发起 POST /process.Process/Start(Content-Type: application/connect+json)。
  5. 调用必现返回错误。

最小复现代码(基于 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

Metadata

Metadata

Assignees

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions