Skip to content
导航

在新建沙箱中运行一条命令

创建一个沙箱,在其中运行命令,返回结果,然后删除沙箱。沙箱的生命周期与请求完全一致:命令结束或调用方挂断时,沙箱随之删除。命令默认最多运行 300 秒,可用 timeout_seconds 修改。无论命令运行多久,调用都会一直等待:这里不会返回 202。在响应表明命令已结束之前(JSON 响应,或事件流的 exit、error 或 end 事件),指定了 name 的沙箱已从节点的表中移除,名称也已释放:下一个调用可以立即使用同一名称。

以事件流 (text/event-stream) 返回:事件有 start、stdout、stderr、gap、exit 和 error:见事件流和终端。

所需权限范围:write 和 exec。

POST
https://api.glac.ai/v1/run

授权

  • apiKeyHTTPrequired

请求头参数

  • X-Request-Idoptionalstring

    调用方为请求自定的 id:1 到 64 个字母、数字、.、_ 和 -。节点随后以它标识该请求:出现在响应的 X-Request-Id、错误响应体和节点日志中。其他任何值都会被忽略,由节点生成 id。

    pattern: ^[A-Za-z0-9._\-]{1,64}$
  • Idempotency-Keyoptionalstring

    让请求可以安全地重发。见简介中的“Idempotency-Key”一节。

    maxLength: 255 · minLength: 1

请求体JSON必填

  • commandrequired

    字符串是交给 sh -c 的一行命令;列表按原样运行,不经过 shell,第一个词像 shell 那样查找:沿着命令自身环境中的 PATH(镜像的,加上 env 的设置)。最多 1000 个参数,不能含 NUL 字节。

    以下之一:

    • string
    • array<string>
  • startoptionalboolean

    true:虚拟机启动时运行镜像自己的启动命令(ENTRYPOINT 和 CMD);false:不启动任何东西,无论镜像的标签要求什么。只要给出了(start、start_command 和 ready 中的任何一个),就只以它为准:不读取镜像的标签 sbx.start 和 sbx.ready。沙箱从用这些设置和 env 构建的模板创建(同一镜像的两种设置就是两个模板;某种设置的第一个沙箱在构建期间以 starting 返回),只有其所有者的沙箱会从这个模板创建。不适用于从 snapshot 或 template 创建的沙箱 (400 invalid_start)。

  • start_commandoptional

    启动命令,以镜像的用户身份运行,其输出由沙箱的代理程序作为命令 exe-start 的输出保留(最后 16 MiB,像任何命令一样用 GET …/exec/exe-start 和 …/exec/exe-start/output 读取;对于应用的实例,这也是应用日志中该实例的内容):字符串由 /bin/sh -c 运行,可以有多行;列表按原样运行,不经过 shell(适用于没有 shell 的镜像)。最多 1000 个参数、64 KiB,不能含 NUL 字节,第一个参数不能为空。与 start: false 一起给出时返回 400 invalid_start。

    以下之一:

    • string
    • array<string>
  • readyoptional

    沙箱模板的虚拟机何时算作已启动:只有这项检查通过后,节点才会保存模板(使用这些设置的每个沙箱都从它克隆),这样每个沙箱中的服务从一开始就在运行。三者选一。tcp 和 http 由节点在宿主机上,通过预览 URL 访问沙箱所用的地址进行尝试:不需要在沙箱中运行任何东西,因此没有 shell 的镜像也能检查,但服务必须监听所有地址,而不只是 127.0.0.1。command 以镜像的用户身份在沙箱中由 sh 运行,与标签 sbx.ready 一样。每 0.2 秒尝试一次,最多 120 秒;在此期间启动命令以失败结束的,等待立即结束。无论哪种情况,沙箱都会以 failure_code boot_failed 失败,failure 会给出检查最后得到的结果以及启动命令最后打印的内容。需要 start: true 或 start_command (400 invalid_start)。不给出时:不等待,直接保存模板。

    以下之一:

    • object
    • object
    • object
  • egressoptionalobject | null

    沙箱可以访问什么,以及它的哪些请求会被加上机密,与 SandboxCreate 中相同。

    • defaultoptionalallow或deny或null
    • allowoptionalarray | null
    • denyoptionalarray | null
    • httpoptionalarray | null
    • injectoptionalarray | null
    • deny_portsoptionalarray | null

      任何连接都到达不了的端口,TCP 或 UDP,无论规则的其他部分怎么说:最多 64 个,每个为 1 到 65535。null 或为空:没有。

  • guest_mitigationsoptionalboolean

    客户机内核是否保留针对推测执行的缓解措施。它们保护客户机内核不受同一沙箱中进程的攻击:当一个沙箱运行多个互不信任的用户的代码时,请开启它们。无论如何,宿主机都会把各沙箱相互隔离。默认:节点的设置(关闭)。该设置在内核启动时确定:第一个设置与其镜像模板不同的沙箱,会像新镜像一样启动(以 starting 返回),从快照创建的沙箱沿用快照的设置(请求另一种设置会返回 400)。

  • tmpoptionaldisk或memory

    沙箱的 /tmp 放在哪里。disk:与其他部分一样放在磁盘上。memory:最多占其内存一半的 tmpfs,在第一个命令之前挂载(对从模板或镜像创建的沙箱,覆盖在模板客户机放在那里的内容之上;从其磁盘启动时由客户机的 init 挂载):写在那里的内容占用客户机的内存,按内存计费,休眠时保留,从磁盘重新启动时消失。如果快照所属的沙箱把它放在内存中,从该快照创建的沙箱无论这里怎么设置也都放在内存中。

    default: "disk"
  • runtimeoptional

    其虚拟机及其命令的运行时设置,与 Compose 文件中的 ulimits、sysctls、tmpfs、dns 和 shm_size 一样 (Runtime)。对从镜像创建的沙箱:会用这些设置为调用方构建一个专属模板(没有指定启动方式时,按镜像的标签启动镜像)。从快照或模板创建的沙箱会被拒绝 (400 invalid_start),它们沿用其虚拟机已有的设置。

    以下之一:

    • NodeRuntime
      • ulimitsoptionalobject | null

        按 Docker 的名称(core、cpu、data、fsize、locks、memlock、msgqueue、nice、nofile、nproc、rss、rtprio、rttime、sigpending、stack):一个数字同时作为两个限制,或者 {soft, hard},软限制不能高于硬限制;-1 表示不限制。nofile 为 1 到 1048576(客户机的 fs.nr_open),不能为 -1。以 {soft, hard} 形式显示。

      • sysctlsoptionalobject | null

        Docker 允许容器设置的那些,按名称:net.*、kernel.shm*、kernel.msg*、kernel.sem、fs.mqueue.*;值为单行 1 到 1024 字节。以字符串形式显示。

      • tmpfsoptionalarray | null

        挂载时禁用 set-user 位和设备文件。

      • dnsoptionalobject | null

        取代镜像的 /etc/resolv.conf。在节点自己回答沙箱查询的地方(在其项目网络中;出站规则可以拒绝某个名称时),节点会代替所指定的服务器回答:只有节点不代为回答的沙箱,才会直接向这些服务器查询。

        • serversoptionalarray | null
        • searchoptionalarray | null
        • optionsoptionalarray | null
      • shm_size_bytesoptionalinteger | null
        maximum: 1099511627776 · minimum: 1048576
    • null
  • initoptional

    沙箱的 PID 1 是什么。不给出或为 null:平台的 init,它会启动镜像的启动命令(如果有的话:start、start_command、镜像的标签)。systemd:完整的系统。镜像自己的 systemd 作为 PID 1,节点的代理程序是它的一个服务:用户可以安装软件包、用 systemctl 启动服务、使用 cron 和 journal,并通过 SSH 登录,就像在一台机器上一样。创建请求指定的任何东西都不会被启动(start、start_command 和 ready 会被拒绝,返回 400 invalid_start),在 systemd 报告机器已启动后保存模板。不带 image 时:使用节点的完整系统镜像(--systemd-image;带 systemd 和 OpenSSH 的 Ubuntu 24.04,sandboxd/images/ubuntu),没有这种镜像的节点会拒绝,返回 400 invalid_start。没有 systemd (/usr/lib/systemd/systemd) 的镜像会构建失败,failure_code 为 invalid_image。其模板对以同样方式请求同一镜像的任何人都可用,除非其中有调用方自己的东西(runtime、image_pull_secret)。从快照或模板创建的沙箱会被拒绝 (400 invalid_start),它们沿用其虚拟机原来的样子。沙箱的其他一切功能都与任何沙箱一样:命令、文件、终端、SSH 网关、休眠和唤醒、快照和分叉、迁移、出站规则(sandboxd/README.md,「整个系统:systemd 当 PID 1」)。

    以下之一:

    • string
    • null
  • project_networkoptionalboolean

    true:沙箱在运行任何东西之前就接入其项目的私有网络,使用节点为该项目预留的第一个空余地址 (setProjectNetwork):响应会给出是哪个地址 (project_address)。项目就是调用的所有者,所以这是供控制平面代项目发起的调用使用的;在独立运行的节点上,沙箱不属于任何人,要接入网络需要在网络中指定它。沙箱除非提出请求,否则不会接入任何项目网络:默认 false。分叉出的副本不接入任何网络,无论原沙箱在哪个网络中。

  • imageoptionalstring

    OCI 镜像引用(python:3.12、ghcr.io/org/app@sha256:…),位于互联网上的镜像仓库:可以是对所有人开放的仓库,也可以是需要登录的仓库(配合 image_pull_secret)。某个镜像的第一个沙箱在节点拉取镜像并构建模板期间以 starting 返回;之后的沙箱从模板启动。默认:节点的基础镜像。

    maxLength: 512
  • image_pull_secretoptionalstring

    保存非公开镜像所在仓库凭据的机密 (PUT /v1/secrets/{name}) 的名称:可打印 ASCII 格式的 username:password,用户名到第一个冒号为止。只接受令牌的仓库会说明与令牌搭配的用户名(ECR 为 AWS,Google 的为 oauth2accesstoken,GHCR 任何名称均可)。节点只把凭据交给拉取镜像的工具:沙箱、其模板和节点日志中都不会有凭据的任何内容,仓库拒绝凭据时给出的说明也不含凭据(failure_code 为 registry_auth_failed)。沙箱从只属于其所有者的模板创建,只有指定了凭据的创建请求才会找到这个模板:不带凭据指定同一镜像时,无论节点有没有该模板,都会不登录直接向仓库请求镜像。该机密必须存在 (404 secret_not_found),必须允许发往镜像所在的仓库(其 allowed_hosts 涵盖镜像引用中写的仓库主机,不含端口,没有指定时为 docker.io;否则返回 403 secret_host_not_allowed),且必须保存这样一对凭据 (400 invalid_field),还必须与 image 一起使用(沙箱不是从镜像创建时返回 400 invalid_field)。

    maxLength: 128
  • snapshotoptionalstring

    快照的 id 或名称:沙箱从创建快照的那一刻继续运行,包括其进程。

  • templateoptionalstring

    节点上模板的键(base、img-…),与 GET /internal/node 列出的一致。参考 README 中没有记录;基准测试脚本会用到它。

  • limitsoptionalobject

    创建请求所要求的规格。没有给出(或为 null)的每一项,都取节点基础模板的值,也就是不指定规格的沙箱得到的规格。最多为本节点给沙箱的上限,即 GET /internal/node 的 max_vcpus 和 max_memory_bytes(默认为宿主机的 CPU 数,最多 32,以及其内存;从不小于基础模板的规格);超出返回 400 invalid_field。同一镜像的每种规格都是一个独立的模板:节点还没有用该镜像构建过某种规格时,这种规格的第一个沙箱在节点用同一镜像构建模板期间以 starting 返回,之后的沙箱从它克隆。不带 image 时,基础模板以外的规格从节点的基础镜像构建。从 snapshot 或 template 创建的沙箱沿用其规格:请求相同的规格没问题,请求其他规格返回 400 invalid_field(param 为 limits)。磁盘大小由节点决定:给出 disk_bytes 返回 400 invalid_field。

    • vcpusoptionalinteger | null

      虚拟 CPU 数。

      maximum: 32 · minimum: 1
    • memory_bytesoptionalinteger | null

      内存,以字节表示:偶数个 MiB(2 MiB 页的整数倍),不少于 128 MiB。其他任何大小都返回 400 invalid_field(param 为 limits.memory_bytes),预先创建的模板 (POST /internal/templates) 和就绪列表中的规格 (ready_images.unread_lines) 也一样:把模板内存放在大页中的节点会以 2 MiB 页为单位加载虚拟机的内存,Firecracker 会拒绝加载其他大小的内存,因此 285 MiB 的模板虽然能构建,但从它创建的每个沙箱都会失败。不会取整:沙箱要么得到所请求的大小,要么被拒绝。

      format: int64 · minimum: 134217728
  • nameoptionalstring

    调用方为沙箱、快照、存储卷或 SSH 密钥起的名称:1 到 63 个小写字母、数字和连字符,不能以连字符开头或结尾,也不能以 id 前缀开头(sbx-、exe-、snap-、vol-、evt-、req-;SSH 密钥还不能以 sshkey- 开头)。即一个不会被误认为 id 的 DNS 标签。在沙箱、快照、存储卷和 SSH 密钥各自的范围内唯一。

    pattern: ^[a-z0-9]([a-z0-9\-]{0,61}[a-z0-9])?$
  • envoptional映射,值为string

    为这个命令添加到沙箱 env 中的变量;同名时以这里的为准。

  • metadataoptional映射,值为string

    供调用方自用的任意键值对;沙箱列表可以按它们筛选。最多 64 个键,每个键 1 到 64 个字符,值最多 1024 个字符。不要在这里存放机密:元数据以明文保存,沙箱在产生用量期间有过的每组元数据都会随其用量保留十三个月,沙箱删除后也一样(GET /v1/usage 按它们分组和筛选)。

  • volumesoptional数组,元素为object

    在调用返回之前挂载的存储卷。非共享的最多两个。

    • pathstringrequired

      存储卷在沙箱中的挂载位置:/ 以外的绝对路径。

    • volumestringrequired

      存储卷的 id 或名称。

    • read_onlyoptionalboolean | null

      以只读方式挂载。对共享存储卷,这一点在节点上强制执行,而不是在沙箱中。

      default: false
    • copyoptionalboolean | null

      true:新的存储卷(其文件系统中还没有任何东西)在第一次挂载时,写入沙箱镜像在 path 上的内容,与 Docker 对新的具名卷的处理一样:每个文件、目录和链接,连同其所有者、权限、时间、扩展属性和硬链接(比如数据库镜像的数据目录,带有其服务器需要的所有者);然后它就处于这种状态,没有 lost+found,与新的具名卷一样(会自行初始化数据目录的服务器会拒绝非空的目录)。已有内容的存储卷按原样挂载。只在创建沙箱时有效:之后挂载的存储卷 (PATCH) 不接受 copy (400 unknown_field)。

      default: false
    • versionoptional

      volume 指定的云盘的某个版本,以其快照所说的为准 (slice D7):沙箱会得到该版本的一个只读视图,属于它自己,在读取时从对象存储取回,无论云盘在谁手上、在哪里(云盘之后可能已被删除)。以只读方式挂载。

      以下之一:

      • DriveVersion
        • namestringrequired

          其根在对象存储中的名称。

          pattern: ^disks/vol-[0-9a-hjkmnp-tv-z]{16}/e[0-9]+/r[0-9]{10}-[0-9a-f]+$
        • bytesintegerrequired
          format: int64 · minimum: 0
        • epochintegerrequired
          format: int64 · minimum: 1
        • numberintegerrequired
          format: int64 · minimum: 1
        • tokenstringrequired
          pattern: ^[0-9a-f]+$
        • refsstringrequired

          其引用列表,在对象存储中:控制平面的回收程序为它保留的内容。

        • storestringrequired

          其根、页和帧所在存储的标识。

        • keystringrequired

          加密它所用密钥的编号(在密钥开始编号之前的版本为空)。

      • null
  • public_portsoptional数组,元素为integer

    任何人都可以通过其短预览 URL 打开的端口。

    maximum: 65535 · minimum: 1
  • public_ports_exceptoptionalarray | null

    除这些端口外,其他所有端口也都公开:其短预览 URL 对任何人开放,与 public_ports 中的端口一样(这是 E2B 处理沙箱端口的方式;控制平面的 E2B 兼容层给出 [49983],即 envd 的端口,用沙箱令牌打开)。[]:所有端口。null(默认):只有 public_ports。端口按顺序,每个只取一次。

  • inboundoptionalarray | null

    从一开始就在沙箱自有 IPv6 地址上向互联网开放的端口,各附其来源(之后可用 …/tcp/{port} 开放)。没有地址池的节点会拒绝非空列表:409 no_ipv6。

  • sleep_after_secondsoptionalnumber | null

    空闲多少秒后休眠。null:从不自行休眠。默认值为节点的设置(--sleep-after-seconds,未设置时为 30)。

    maximum: 1000000000 · minimum: 1 · default: 30
  • expires_atoptionalstring | null

    在这个时间删除沙箱,必须是将来的时间(或者按 on_expiry 的设置处理)。null 或不给出:永不。

    format: date-time
  • on_expiryoptionaldelete或sleep或hold或null

    expires_at 到时做什么:delete 删除沙箱(null 或不给出时:即此项);sleep 让它休眠(不管里面在做什么)并保留它(此后其 expires_at 为 null,请求照常会唤醒它);hold 同上,但保持休眠(此时会设置 held_asleep:请求不会唤醒它)。这是 E2B 在沙箱到期时暂停它的方式(控制平面的 E2B 兼容层)。其他值返回 400 invalid_field。

    default: "delete"
  • held_asleepoptionalboolean | null

    true:休眠期间,发往其端口的请求不会唤醒它:预览监听器会代为返回 502 sandbox_paused,与 E2B 的代理对已暂停沙箱的响应一样 (x-preview-ingress),只有 API 调用(或它自己的定时器)才会唤醒它。它本身不会让沙箱休眠:那是 POST /v1/sandboxes/{id}/sleep 的事。false 或 null:与任何沙箱一样。(相当于 E2B 不带 autoResume 的 pause,由控制平面的 E2B 兼容层设置,在其 connect 时移除。)

    default: false
  • sleep_notice_msoptionalinteger | null

    与 SandboxCreate 中相同:接受,但不起作用,因为该沙箱从不休眠。

    maximum: 60000 · minimum: 0
  • sleep_hold_max_msoptionalinteger | null

    与 SandboxCreate 中相同:接受,但不起作用,因为该沙箱从不休眠。

    maximum: 900000 · minimum: 0
  • suspend_after_msoptionalinteger | null

    与 SandboxCreate 中相同:接受,但不起作用,因为该沙箱从不休眠。

    maximum: 86400000 · minimum: 1000
  • wake_daily_atoptionalstring | null

    与 SandboxCreate 中相同:接受,但不起作用,因为该沙箱从不休眠。

    pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
  • checkpointoptional

    与 SandboxCreate 中相同:接受,并在命令运行期间创建检查点。

    以下之一:

    • object
    • null
  • delete_after_idle_msoptionalinteger | null

    与 SandboxCreate 中相同:接受,但不起作用,因为该沙箱从不休眠。

    format: int64 · minimum: 1000
  • hostnameoptionalstring | null

    与 SandboxCreate 中相同。

    maxLength: 63 · pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$
  • stopoptionalobject | null

    在虚拟机被彻底结束之前如何停止沙箱的启动命令:在重启 (POST /v1/sandboxes/{id}/restart) 和删除之前。信号发给启动命令,然后给它 grace_ms 时间结束;到时还没结束的随虚拟机一起结束。休眠或暂停的虚拟机不会被停止:它会从上次停下的地方继续。不给出时:启动命令随其虚拟机一起结束,一直以来都是这样。不认识的键:400 unknown_field;不是这些信号之一,或者宽限时间超过十分钟:400 invalid_field。

    • signaloptionalSIGTERM或SIGINT或SIGQUIT或SIGHUP或SIGUSR1或SIGUSR2另有 15 个

      用名称指定,带不带 SIG 均可。null:镜像自己的停止信号(其 STOPSIGNAL),没有则为 SIGTERM。

    • grace_msoptionalinteger | null

      null 或不给出:10000 毫秒。

      maximum: 600000 · minimum: 0
  • secret_envoptional映射,值为string

    与 SandboxCreate 中相同:更多的变量,其值为机密,作用于沙箱,因此也作用于命令;其中任何一个都不能同时出现在 env 中(400 invalid_field,param 为 secret_env.<name>)。任何响应都不显示值。

  • cwdoptionalstring

    运行所在的绝对路径。默认:镜像的工作目录。目录不存在不算调用的错误:命令以退出码 126 结束。

  • useroptionalstring

    用户名、uid 或 uid:gid。默认:镜像的用户。

    maxLength: 64 · minLength: 1
  • timeout_secondsoptionalnumber

    与 RunRequest 中相同,但有默认值:否则没有任何东西会让该沙箱停下来。

    maximum: 1000000000 · default: 300
  • stdinoptionalstring

    喂给命令输入的内容,之后关闭输入(除非 stdin_open)。encoding 指定时为 Base64。整个请求最大 64 MiB(超出时返回 413 body_too_large):更长的输入请分多次调用 …/exec/{exec_id}/stdin 发送,或者先写入文件。

  • encodingoptionalutf8或base64

    base64:stdin 为 base64,stdout 和 stderr 也以 base64 返回(在事件流中:事件携带 base64 而不是 text)。用于非文本的输出。

    default: "utf8"
  • streamoptionalboolean

    以事件流返回。默认:请求的 Accept 包含 text/event-stream 时为 true。

  • wait_for_readeroptionalboolean

    让命令等待读取本调用响应的一方,而不是抢在它前面运行。与 RunRequest 中相同。

    default: false
  • regionoptionalna或eu或ap或null

    创建所在的区域,由 API 读取,不会转发。null 或不给出:API 自己运行所在的区域。该区域没有机器能容纳时,由下一个区域接手;必须放在某台特定机器上的(从快照或带存储卷创建的,或用同一个 Idempotency-Key 再次发送的)会放到那台机器上,无论在哪个区域。从备份创建的存储卷创建在备份所在的区域:指定其他区域会返回 400 invalid_field。不是有效区域:400 unknown_region。响应中的 region 说明它创建在哪里。

Returns

200

命令已结束:以 JSON 返回结果,或返回直到结束的事件流。sandbox_id 指明所用的沙箱,它已不复存在。

JSON
  • idstringrequired

    exe- 加 16 个字符。带 Idempotency-Key 时,由沙箱的 id、调用(run 或 exec)和该键推导而来。

    pattern: ^exe-[0-9a-hjkmnp-tv-z]{16}$
  • objectstringrequired
  • sandbox_idstringrequired
    pattern: ^sbx-[0-9a-hjkmnp-tv-z]{16}$
  • commandstringrequired

    命令的文本形式:命令行,或用空格连接的各参数;不带命令启动的终端为 shell。最多 1024 个字符。随快照或分叉带来的命令,按其开始时的样子列出:沙箱自己保存这一信息。

  • ttybooleanrequired

    是否在终端上运行。

  • statusstringrequired

    exited:自行结束,退出码不限。timed_out:timeout_seconds 到时。killed:被信号结束。

  • exit_codeinteger | nullrequired

    运行期间为 null。被信号结束时为 128 加信号编号。非零退出码是一种结果,不是错误。

  • signalstring | nullrequired

    结束它的信号,如 SIGTERM、SIGKILL 等,守护进程不知道名称的信号写作 SIG<number>;其他情况为 null。

    pattern: ^SIG[A-Z0-9]+$
  • started_atstringrequired

    按沙箱的时钟:完整对象和列表中的值相同。

    format: date-time
  • pidintegerrequired

    它在沙箱中的进程 id。

  • duration_secondsnumber | nullrequired

    从开始到结束的实际耗时,单位为秒。运行期间为 null。

    minimum: 0
  • usagerequired

    运行期间为 null。

    以下之一:

    • ExecUsage
      • cpu_secondsnumberrequired

        命令及其等待的子进程所用的用户态和内核态 CPU 时间,单位为秒。

        minimum: 0
      • max_memory_bytesintegerrequired

        其中最大的常驻内存。

        format: int64 · minimum: 0
    • null
  • outputobjectrequired

    命令已写出多少,以及其中哪一部分仍可读取。

    • stdout_bytesintegerrequired

      到目前为止写入 stdout 的字节数。

      format: int64 · minimum: 0
    • stderr_bytesintegerrequired
      format: int64 · minimum: 0
    • startintegerrequired

      仍保留的最旧字节的位置。位置把两个流的字节合在一起、按写出的顺序计数;沙箱保留最后 16 MiB。

      format: int64 · minimum: 0
    • endintegerrequired

      最新字节之后的位置。

      format: int64 · minimum: 0
  • stdoutstringrequired

    stdout 的最后 1 MiB。文本,不是 UTF-8 的字节会被替换;encoding 为 base64 时为 base64。

  • stderrstringrequired

    stderr 的最后 1 MiB。

  • truncatedbooleanrequired

    任一个流超过 1 MiB,或部分输出已不再保留时为 true。

  • encodingstringrequired

    stdout 和 stderr 的编码方式:与请求的要求一致。

EVENT-STREAM
string

400

请求不符合本调用的要求。invalid_json:请求体不是 JSON 对象;unknown_field:请求体中有本调用不接受的字段;unknown_parameter:查询中有本调用不接受的参数;invalid_field:某个字段或查询参数类型错误或超出范围;invalid_name:name 不是有效的名称;invalid_env:env 中有环境变量无法容纳的名称或值;invalid_metadata:metadata 超出限制;expires_in_the_past:expires_at 不是将来的时间;invalid_egress:egress 不是有效的规则集:param 指明出错的部分;invalid_start:给出的 start、start_command 和 ready 不能这样搭配(有 ready 却没有启动命令,start: false 却带了 start_command),或者其中某一项与 init: "systemd" 一起给出(此时由 systemd 按其单元启动程序),或者 init: "systemd" 没有指定 image,而节点上没有完整系统的镜像 (--systemd-image),或者沙箱是从 snapshot 或 template 创建的:param 指明是哪个字段;ambiguous_source:image、snapshot 和 template 给出了不止一个;invalid_image:image 不是指向互联网上镜像仓库中某个镜像的引用;invalid_path:某个存储卷的 path 不是绝对路径,或者是 /;missing_command:缺少 command;no_such_user:user 不是沙箱中的用户;invalid_idempotency_key:Idempotency-Key 为空或超过 255 个字符。
JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

401

missing_api_key, invalid_api_key, expired_api_key, invalid_token.
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

403

凭据无权执行此操作。needs_api_key:沙箱令牌不能执行此操作。spend_limit_reached:已达到支出上限。secret_host_not_allowed:机密会被发往它不允许去的主机:通过 egress.inject,或作为 image_pull_secret 发往 image 的镜像仓库(param 指明是哪一个;与 error 并列的 allowed_hosts 列出它可以去的地方)。account_share_reached:账户在本节点数据盘上占用的空间已达到单个账户的上限(见 GET /internal/node 的 drive.accounts),放不下沙箱的内存外加 1 GB 的写入空间。没有创建任何东西。
JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

404

请求中指定的对象不存在。snapshot_not_found:快照不存在;template_not_found:模板不存在;volume_not_found:volumes 中指定的某个存储卷不存在;secret_not_found:egress.inject 中指定的机密,或 image_pull_secret 指定的机密不存在。
JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

409

某个对象的状态不允许此操作。name_taken:名称已被占用;volume_in_use:volumes 中某个非共享存储卷属于另一个沙箱;duplicate_volume:某个存储卷在 volumes 中出现了两次;mount_path_taken:volumes 中有两个存储卷的 path 相同;too_many_volumes:volumes 中非共享存储卷的数量超过了沙箱所在机器的空余磁盘数(八个;从早于八个磁盘时期的模板或快照创建的沙箱为两个);snapshot_lost:快照的 status 为 lost;no_project_address:请求了 project_network,但节点上没有该项目的网络,或者网络中已没有空余地址;command_lost:调用等待期间命令消失了;sandbox_failed:沙箱无法启动:错误信息会说明原因(比如无法拉取镜像);idempotency_key_reused:该键已与另一个请求体一起使用过;idempotency_in_progress:使用该键的第一个请求仍在执行。checkpoints_unavailable(param 为 checkpoint):开启了 checkpoint,但本节点不支持检查点(它不把磁盘复制到对象存储,或者它的内存不分层)。
JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

503

不可用。not_served_here:给出了 egress 规则,但本节点无法执行规则(它没有 nft);或者请求了 project_network,但本节点不把沙箱放进项目网络;或者沙箱要从节点没有模板的 image 创建,而本节点不拉取镜像(原因见 GET /internal/node 的 image_pulls;param 为 image);或者 key_missing:本节点启用了加密 (src/seal.rs),却没有所属项目的密钥或平台的密钥(错误信息会说明是哪一个):控制平面会提供密钥,之后再次发起同一调用即可 (Retry-After);或者 unavailable:volumes 中的某个存储卷没能及时挂载,稍后再次发起同一调用即可 (Retry-After):客户机没能在 60 秒内完成挂载(云盘的数据块迟迟不来:对象存储不在线,或取块程序连不上),或者这样的挂载之后它仍在从机器上卸下,或者它是逐块传来的云盘,而它的数据块暂时没有任何来源响应。
JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

504

调用方已离开。caller_gone:调用方挂断了连接。
JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

default

其他任何失败,格式相同。internal (500):节点出错;错误信息不会多说,节点日志中以请求的 id 记录了原因。unavailable(503,可重试):no_capacity,节点的网络槽位都已占用;memory_full,调用需要启动的虚拟机(创建、唤醒、从磁盘启动、恢复、回滚、构建)在宿主机内存中放不下(还要算上已承诺给其上运行的虚拟机的内存),也没有暂停或空闲的虚拟机可以让其休眠来腾出空间(节点的 memory);drive_full,调用需要构建模板,而节点的数据盘没有空间(节点的 drive);unavailable,节点正在关闭、沙箱 10 分钟后仍处于 starting、沙箱没有响应,或者沙箱正在迁到本节点(带 Retry-After: 1);fenced,节点的租约隔离了该沙箱 (Node.lease)。moved (409):沙箱已迁到另一个节点,由 to 指明。

JSON
  • errorobjectrequired
    • typestringrequired

      失败的类别。它决定状态码:invalid_request 400、unauthenticated 401、forbidden 403、not_found 404、conflict 409、too_large 413、internal 500、bad_gateway 502(预览监听器、出站代理,以及无法带回其沙箱的接管)、unavailable 503、timeout 504。

    • codestringrequired

      具体是哪种失败。本文档顶层的 x-error-codes 表说明了每一个的含义。

    • messagestringrequired

      给人看的说明。英文。

    • paramstring | nullrequired

      出错的字段或查询参数(如果有)。

    • retryablebooleanrequired

      在其他条件都不变的情况下,同一请求稍后可能成功时为 true。

    • request_idstringrequired

      所在响应的 X-Request-Id,响应是针对 Idempotency-Key 的重放时也一样。

      pattern: ^[A-Za-z0-9._\-]{1,64}$
    • docs_urlstring | nullrequired

      节点的 --docs-url 加上错误码,或者为 null。

  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null。

  • tooptionalstring | null

    随 moved 和 sandbox_moved 返回:沙箱被交给的节点,以控制平面给它起的名称为准,或者为 null。

  • epochoptionalinteger

    随 moved 和 sandbox_moved 返回:沙箱被释放时的纪元。随 wrong_epoch 返回:本节点持有它或释放它时的纪元。

    format: int64 · minimum: 1
  • offsetoptionalinteger

    随 sandbox_moved 返回:调用、事件流或终端在命令输出中已读到的位置(事件流最后一个事件的 id):在沙箱去往的地方从这里接着读(Last-Event-ID,或 from)。

    format: int64 · minimum: 0
  • exec_idoptionalstring

    随 POST …/run 的 sandbox_moved 返回:调用启动并在等待的命令的 id,命令在沙箱去往的地方继续运行:迁移结束后,通过控制平面用 GET …/exec/{exec_id}?wait_seconds= 在那里等待它。再次发起同一调用会再启动一次命令,除非带着同一个 Idempotency-Key。

  • disk_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存到休眠时的磁盘所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • memory_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存那次休眠的内存镜像所等的时长,单位为毫秒;没有等待时为 null。

    minimum: 0
  • drives_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱云盘的当前状态所等的时长,单位为毫秒 (slice D2);没有等待或没有云盘时为 null。

    minimum: 0
  • image_msoptionalnumber | null

    随 copy_behind 返回:释放时为等待对象存储保存沙箱磁盘所基于的镜像所等的时长,单位为毫秒(其节点会在模板的镜像上传之前就复制磁盘);没有等待时为 null。

    minimum: 0
  • imageoptionalstring

    随 image_missing 返回:对象存储中没有的镜像的 id,与基于它的磁盘和模板的 disk_image 中的名称一致。

    pattern: ^[A-Za-z0-9_-]{1,128}$
  • buildoptionalstring

    随 build_missing 返回:写下沙箱内存的 Firecracker 构建版本,本节点没有保留它。

    pattern: ^[0-9a-f]{16}$

输入以搜索……

↑↓ 切换↵ 选择Esc 关闭