跳转到内容
Rayrun
登录注册

镜像与构建

镜像登记、从沙箱保存镜像、Dockerfile 构建作业。 完整参数、请求 / 响应 schema 见下方(本页只渲染该组):

v0.1.0
OpenAPI 3.0.3

Rayrun API

Rayrun REST API —— 控制台与命令行(rayrun CLI)的统一接口,也是自托管部署的 第三方集成的接入点。共 13 组、93 个端点(分组见左侧栏或「介绍」页的接口一览)。 基地址与部署同源:<实例地址>/v1(如 https://rayrun.example.com/v1)。 认证:Bearer Token(控制台「设置 → 我的 API Token」或 rayrun login 创建) 或浏览器会话 Cookie;GET /health 免认证。详见「介绍」页的认证一节。

Server:https://api.rayrunos.com/v1

Rayrun 托管平台

Client Libraries

镜像与构建

​

镜像登记、从沙箱保存镜像、Dockerfile 构建作业。

可用 agent 镜像列表(平台登记册已上线行 + 本组织用户镜像)

​

前端创建表单的 Agent Image 选择数据源,两段构成:

  • 平台段:登记册 status=published 的行,逐个对盘校验 manifest; 顺序 = 登记册的人工排序(sort_order,管理员可调)—— 第一项即创建页 默认选中的镜像。source 恒为 platform。
  • 用户段:调用者本组织的自建镜像(saved / built),按 name/version 升序追加在平台段之后。其他组织的用户镜像不在响应里。

两段的 source 字段供客户端分组展示(官方 / 我的)。

Responses

  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/agents
curl https://api.rayrunos.com/v1/agents \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "agents": [
    {
      "name": "claude-code",
      "version": "1",
      "source": "platform",
      "description": "string",
      "allow_domains": [
        "mirrors.aliyun.com"
      ],
      "credential_slots": [
        "ANTHROPIC_AUTH_TOKEN"
      ],
      "supports_desktop": true,
      "desktop_port": 6080
    }
  ]
}

镜像列表(平台 + 保存 + 构建,带来源与实占)

​

列表项的 size_bytes 是本镜像自身的实占(不含它引用的基座): 派生镜像的 rootfs.ext4 是软链,基座共享 —— 算进来会重复计数。

Responses

  • application/json
  • application/json
  • application/json
Request Example for get/images
curl https://api.rayrunos.com/v1/images \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "images": [
    {
      "ref": "string",
      "name": "string",
      "version": "string",
      "source": "platform",
      "description": "string",
      "base": null,
      "base_image": null,
      "size_bytes": 1,
      "created_at": null,
      "owner_user_id": "string"
    }
  ]
}

从沙箱保存镜像(同步,秒级)

​

要求源沙箱处于 Stopped(否则 409 sandbox_not_stopped)—— 不静默停掉用户正在跑的 agent 任务。构建沙箱不可保存(409 illegal_state)。

产出 = 一张 overlay.ext4(源沙箱叠加盘的稀疏复制)+ 一条指回基座的 rootfs.ext4 软链 + 派生 manifest + image.json。同名再次保存递增 版本号(myimg@1 → myimg@2),不覆盖。

注意:完整 Dockerfile 构建(POST /v1/builds)不走本端点,产物是独立 rootfs(image.json v2 standalone)。

Body

required
application/json
  • 小写字母数字与 . _ -,≤64 字;同时是镜像目录名

  • 卡片上的一两行说明,≤200 字(写进 manifest [agent].description)

Responses

  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/images
curl https://api.rayrunos.com/v1/images \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "sandbox_id": "",
  "name": "",
  "description": ""
}'
{
  "ref": "string",
  "name": "string",
  "version": "string",
  "source": "platform",
  "description": "string",
  "base": null,
  "base_image": null,
  "size_bytes": 1,
  "created_at": null,
  "owner_user_id": "string"
}

删除用户自建镜像

​

平台镜像(无 image.json)不可删(403)。被沙箱引用(存在非 Terminated 且 agent == ref 的沙箱)或被派生镜像引用(另一张镜像的 rootfs.ext4 软链指向它)时 409 image_in_use —— 后者是「断链」:不挡的话删除当时 不报错、下次创建才炸。

Path Parameters

  • @

Responses

  • 已删除

  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/images/{ref}
curl 'https://api.rayrunos.com/v1/images/{ref}' \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
No Body

提交 Dockerfile 构建(异步,202)

​

在隔离的构建沙箱里用 buildah 执行完整 Dockerfile(多阶段、COPY/ADD、 ARG、USER、SHELL、heredoc 等)。FROM 支持公共 registry 镜像;V1 不支持 FROM <rayrun-ref>(返回 400 unsupported_base)。

两种提交方式:

  • application/json:只有 Dockerfile 文本,没有构建上下文(兼容旧客户端);
  • multipart/form-data:Dockerfile + 可选 context.tar.gz(COPY 需要), egress / build_args 以 JSON 字符串字段传递。

副作用在 202 之前发生:校验、FROM 预处理、egress 合并、context 落盘 全部先做完 —— 配方错了不会有半个沙箱留下。

Body

required
  • Dockerfile 原文,≤256 KiB

  • 产出的镜像名(小写字母数字与 . _ -,≤64 字)

  • 构建参数(最多 100 项;值不会写入审计日志)

    Properties: 1
  • 镜像说明,≤200 字

  • Properties: 4

Responses

  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/builds
curl https://api.rayrunos.com/v1/builds \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "",
  "description": "",
  "dockerfile": "",
  "egress": {
    "allow": [
      ""
    ],
    "deny": [
      ""
    ],
    "allow_all": false,
    "bandwidth_mbps": 0
  },
  "build_args": {
    "additionalProperty": ""
  }
}'
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "kind": "save",
  "status": "pending",
  "image_name": "string",
  "dockerfile": "string",
  "image_ref": null,
  "base_agent": "string",
  "base_image": null,
  "has_context": true,
  "context_bytes": 1,
  "image_size_bytes": null,
  "failure_reason": null,
  "sandbox_id": null,
  "created_at": "2026-11-11T06:00:17.727Z",
  "started_at": null,
  "finished_at": null
}

构建作业历史(Builds tab 的数据源)

​

作业状态是 journal 的物化视图(不新开表)。保存也产生一条历史记录 (kind=save,瞬时完成)——「创建镜像就产生一条记录」,两条来源口径一致。 最新在前。

Query Parameters

  • 省略 = 全量(单机作业规模是几十到几百)

Responses

  • application/json
  • application/json
  • application/json
Request Example for get/builds
curl https://api.rayrunos.com/v1/builds \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "builds": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "kind": "save",
      "status": "pending",
      "image_name": "string",
      "dockerfile": "string",
      "image_ref": null,
      "base_agent": "string",
      "base_image": null,
      "has_context": true,
      "context_bytes": 1,
      "image_size_bytes": null,
      "failure_reason": null,
      "sandbox_id": null,
      "created_at": "2026-11-11T06:00:17.727Z",
      "started_at": null,
      "finished_at": null
    }
  ]
}

单个构建作业(状态 + 失败原因)

​

Path Parameters

Responses

  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/builds/{id}
curl https://api.rayrunos.com/v1/builds/123e4567-e89b-12d3-a456-426614174000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "kind": "save",
  "status": "pending",
  "image_name": "string",
  "dockerfile": "string",
  "image_ref": null,
  "base_agent": "string",
  "base_image": null,
  "has_context": true,
  "context_bytes": 1,
  "image_size_bytes": null,
  "failure_reason": null,
  "sandbox_id": null,
  "created_at": "2026-11-11T06:00:17.727Z",
  "started_at": null,
  "finished_at": null
}

取消构建作业

​

幂等:已终态 → 204(不写第二条终态记录),不存在 → 404。

取消是免费的:cancel 驱动 ctx → 关掉 exec 的 5003 连接 → guestd 杀整个进程组。构建沙箱随后被销毁。

另一个入口:删掉构建沙箱(DELETE /v1/sandboxes/{id})等价于取消 (—— 两个入口同一个后果,不留「沙箱没了但作业还在跑」)。

Path Parameters

Responses

  • 已取消(或本就是终态)

  • application/json
  • application/json
Request Example for delete/builds/{id}
curl https://api.rayrunos.com/v1/builds/123e4567-e89b-12d3-a456-426614174000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
No Body

构建日志(纯文本,增量轮询)

​

返回 text/plain,并带 X-Next-Offset 响应头:客户端下一次带上 ?offset=<该值> 取增量。单次最多 256 KiB。

日志是追加文件(<DataDir>/builds/<id>/log),不是流式通道 —— 少一个长连接要管。单条 RUN 的输出超过 4 MiB(exec 契约上限) 时写 [truncated] 标记并继续构建(不因日志丢而失败)。

Path Parameters

Query Parameters

  • 起始字节偏移;省略 = 从头读

Responses

  • text/plain
  • application/json
  • application/json
  • application/json
Request Example for get/builds/{id}/log
curl https://api.rayrunos.com/v1/builds/123e4567-e89b-12d3-a456-426614174000/log \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
string

Models