news 2026/9/14 8:28:56

DB-GPT Sandbox 使用指南:多运行时自动选择与沙箱 API 服务快速启动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DB-GPT Sandbox 使用指南:多运行时自动选择与沙箱 API 服务快速启动

DB-GPT Sandbox 使用指南:多运行时自动选择与沙箱 API 服务快速启动

【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI + Data products.项目地址: https://gitcode.com/GitHub_Trending/db/DB-GPT

DB-GPT Sandbox 是为 DB-GPT Agent 提供安全隔离代码执行环境的核心组件,支持 Docker、Podman、Nerdctl 与本地进程四种运行时,并能在同一会话内保持有状态环境(如首次安装的依赖在后续执行中可用)。本文以官方使用文档(packages/dbgpt-sandbox/src/docs/usage.md)为主线,结合仓库源码深入讲解环境准备、运行时自动选择机制、一键启动脚本与对外 API 接口,帮助读者快速将沙箱跑起来并理解其内部实现原理。

一、环境准备

沙箱本体以 Python 实现,对外暴露 FastAPI 服务,对环境要求如下:

  • Python 3.8+:沙箱 API 服务运行的基础环境;仓库内启动脚本实际按 Python 3.10+ 做了显式检查(见 start_api.sh 中的错误提示 "Please install Python 3.10+"),建议直接使用 Python 3.10 及以上版本以避免兼容问题。
  • 容器后端(可选但强烈推荐):Docker / Podman / Nerdctl,三者至少安装其一。容器运行时提供真正的进程隔离,是生产与安全敏感场景的首选。
  • 本地运行时(Local):不做容器隔离,直接在宿主机执行,适合无容器环境下的回退或开发调试,但需要显式开启(下文详述)。

针对不同操作系统,官方建议如下:

操作系统推荐配置
Windows建议使用 WSL2 + Ubuntu 20.04+,WSL2 支持 Docker Desktop 或 Podman
Linux建议安装 Docker 或 Podman
macOS建议安装 Docker Desktop 或 Podman

在动手前可以先通过python3 --versiondocker info(或podman info/nerdctl info)确认 Python 与容器后端均已就绪。需要特别说明的是,沙箱的"本地运行时不做容器隔离,适合无容器环境的回退/开发调试"这一设计,意味着它不应被用于隔离不可信代码的生产场景。

二、架构速览:四层设计的沙箱

在启动服务之前,理解沙箱的分层结构有助于正确使用其接口。根据 architecture.md 与源码目录结构,dbgpt-sandbox 采用四层设计:

  • 用户层(user_layer):service.py 与 schemas.py 对外提供统一的 API 调度,面向产品接口。
  • 控制层(control_layer):control_layer.py 负责跨任务会话管理、依赖安装、执行调度与状态查询。
  • 执行层(execution_layer):包含 base.py(统一抽象SandboxRuntimeSandboxSessionExecutionResultSessionConfig)、runtime_factory.py(自动选择运行时)以及 docker / podman / nerdctl / local 四个具体运行时实现。
  • 展示层(display_layer):display_layer.py 提供DisplayResult,用于容器型运行时的结果封装(包含 GUI、文件等)。

图注:dbgpt-sandbox 分层架构图,展示用户层、控制层、执行层、展示层之间的任务流转与结果回传路径。

需要注意的是:LocalRuntime.execute返回ExecutionResult,而容器运行时返回DisplayResult。若需在控制层统一结果,可在控制层将DisplayResult映射为ExecutionResult,或在 API 层做多态支持(见 architecture.md)。

三、运行时自动选择机制

沙箱启动时会根据本机环境自动选择一个最佳运行时,该逻辑由 runtime_factory.py 中的RuntimeFactory.create()实现:

  1. 显式指定优先:若环境变量SANDBOX_RUNTIME已设置(或传入runtime_preference参数),则将其作为强制选择值,并校验对应运行时是否可用。
  2. 自动探测兜底:未显式指定时,按Docker → Podman → Nerdctl → Local的优先级自动探测。其中 Docker 路径会先通过docker.from_env()建立客户端并调用client.info()确认守护进程实际可用,Podman / Nerdctl 则通过shutil.which()检查 CLI 是否在 PATH 中(见 utils.py 的EnvironmentDetector)。
  3. 失败即关闭(fail-closed):若没有任何容器运行时可用,且未显式开启本地运行时,会抛出RuntimeError("No container sandbox runtime is available..."),而不是悄悄退回不可靠的执行方式。

环境变量与强制指定

在 config.py 中,运行时选择由两个常量控制,均可通过环境变量覆盖:

环境变量可选值说明
SANDBOX_RUNTIMEdocker/podman/nerdctl/local强制指定运行时;未设置时由RuntimeFactory自动探测
SANDBOX_ALLOW_LOCAL_RUNTIME1/true/yes/on是否允许本地进程运行时,默认关闭(False

本地运行时的开启非常谨慎:即使显式传入SANDBOX_RUNTIME=local,只要SANDBOX_ALLOW_LOCAL_RUNTIME未开启,RuntimeFactory._local_runtime()依然会抛错并提示 "LocalRuntime executes code on the host. Set SANDBOX_RUNTIME=local and SANDBOX_ALLOW_LOCAL_RUNTIME=true to opt in explicitly."。

这一点在单元测试 test_runtime_factory.py 中有完整覆盖:

  • test_auto_runtime_fails_closed_without_container:禁用全部容器运行时后调用create(),断言抛出包含 "No container sandbox runtime" 的RuntimeError
  • test_local_runtime_requires_explicit_opt_in:未开启本地运行时许可时调用create("local"),断言抛出 "LocalRuntime executes code on the host";
  • test_local_runtime_can_be_enabled_explicitly:设置SANDBOX_ALLOW_LOCAL_RUNTIME=True后,create("local")返回LocalRuntime实例。

这组测试从侧面印证了官方文档所述"优先级:Docker → Podman → Nerdctl → Local"并非简单的降级逻辑,而是一套带显式许可的安全策略。

四、启动 API 服务

Linux / macOS 一键启动

在沙箱模块根目录(含scripts目录的路径)执行:

./scripts/start_api.sh # 自动创建 .venv 并安装依赖后启动

结合 start_api.sh 的源码,该脚本实际做了四件事:

  1. 运行时选择:支持将第一个命令行参数作为运行时偏好,内部转换为SANDBOX_RUNTIME环境变量(./scripts/start_api.sh docker即强制选择 Docker);
  2. 虚拟环境准备:检测.venv是否存在,不存在则用python3/python创建;
  3. 依赖安装pip install --upgrade pip后执行pip install -r requirements.txt
  4. 启动服务:进入sandbox目录,以uvicorn user_layer.service:app --host 127.0.0.1 --port 8000 --reload启动 FastAPI 服务,监听http://127.0.0.1:8000

也可以通过环境变量直接指定运行时,脚本会原样透传:

SANDBOX_RUNTIME=local ./scripts/start_api.sh # 通过环境变量指定本地运行时

Windows 启动

仓库同样提供了 PowerShell 与 cmd 两个版本的一键脚本:

  • PowerShell:start_api.ps1,用法为.\scripts\start_api.ps1 -Runtime docker|podman|nerdctl|local
  • cmd:start_api.cmd,用法为scripts\start_api.cmd [docker|podman|nerdctl|local]

两者逻辑与 Linux 版一致:自动创建.venv(Windows 下为.venv\Scripts\python.exe)、安装requirements.txt、启动 uvicorn 服务。Windows 上更建议在 WSL2 的 Ubuntu 20.04+ 中运行 Linux 版脚本,配合 WSL2 内的 Docker Desktop 或 Podman 使用。

服务健康检查

服务启动后,可通过以下地址验证:

curl http://127.0.0.1:8000/api/health # 返回 {"status": "ok"} curl http://127.0.0.1:8000/api/methods # 列出所有可用接口

五、对外 API 与编程接口

HTTP API(用户层)

service.py 中注册了以下路由,覆盖会话生命周期全流程:

方法路径说明
GET/health健康检查
POST/api/connect建立沙箱会话,参数user_idtask_idimage_type(运行时类型,如pythonjavascript
POST/api/configure配置沙箱环境,config_info支持languagedependenciesmax_memorymax_cpusnetwork_disabledenv
POST/api/execute在指定会话执行代码,参数session_idcode_typecode_content
POST/api/manual进入手动操作模式(容器运行时返回可连接的 GUI URL)
POST/api/status获取任务/会话状态与资源使用情况
GET/api/sessions列出所有活跃会话
POST/api/get_file获取沙箱内指定文件内容
GET/api/methods获取所有可用接口与方法

会话管理接口(编程接口)

interfaces.md 定义了面向开发者的核心接口:

  • create_session(user_id, task_id, image_type) -> str:创建新会话,返回session_id
  • configure_session(session_id, config_info) -> bool:配置会话参数,config_info支持:
    • language:语言,默认python
    • dependencies:依赖列表(仅容器运行时支持自动安装 pip/npm);
    • max_memory:如"512m"(容器);
    • max_cpus:整数;
    • network_disabled:是否禁网,默认False
    • env:环境变量字典。
  • execute_code(session_id, code_type, code_content) -> dict:执行代码,返回包含输出、错误、耗时、退出码等信息的字典;
  • get_session_status(session_id) -> dict:查询会话当前状态与资源使用情况(内存、CPU 等);
  • disconnect_session(user_id, task_id) -> bool:停止并销毁指定用户任务的会话。

有状态会话与依赖安装

沙箱的核心特性之一是有状态执行:SandboxSessionstart后进入活跃状态(is_active=True),同一会话内的多次execute共享同一环境或容器实例。例如第一次执行安装 pip 依赖,第二次执行即可正常使用该依赖(见 architecture.md)。依赖安装策略按语言区分:

  • Python:pip install --no-input --disable-pip-version-check
  • JavaScript:npm init -y+npm install 包

六、配置参考与资源限制

语言与镜像映射

config.py 中LANGUAGE_IMAGES定义了容器运行时的默认镜像:

语言镜像默认执行命令
pythonpython:3.11-slimpython {filename}
python-vncvnc-gui-browser:latestpython3 {filename}
javascriptnode:18-slimnode {filename}
javaopenjdk:11-jre-slimjavac {filename} && java {filename[:-5]}
cppgcc:latestg++ -o program {filename} && ./program
gogolang:1.21-alpinego run {filename}
rustrust:1.75-slimrustc {filename} -o program && ./program

从源码结构看,容器运行时(Docker/Podman/Nerdctl)支持pythonpython-vncjavascriptjavacppgorust等语言;本地运行时则探测系统可用语言,至少保证python可用。仓库中还提供了 create_docker.py、create_docker_python_gpu.py 等镜像构建脚本,用于预构建沙箱镜像。

默认资源限制

沙箱内置了开箱即用的资源约束(config.py 与 utils.py 中的ResourceLimits):

参数默认值
MAX_MEMORY256MB
MAX_CPU_PERCENT50.0%
MAX_EXECUTION_TIME30 秒
MAX_FILE_SIZE10MB
MAX_DEPENDENCY_INSTALL_TIME300 秒
MAX_DEPENDENCY_INSTALL_SIZE200MB
MAX_PROCESSES10

容器运行时通过容器参数实施限制,本地运行时则借助psutil监控(如ProcessManager.kill_process_tree可递归终止进程树)。执行结果统一通过ExecutionStatus枚举标记:SUCCESS/ERROR/TIMEOUT/RESOURCE_LIMIT(见 base.py)。

七、安全机制与使用限制

沙箱在设计上采取了多重安全措施,使用前应了解其边界:

  • 运行时安全隔离:容器运行时(Docker/Podman/Nerdctl)提供进程级隔离;本地运行时不做隔离,仅适合无容器环境的回退/开发调试,且必须显式开启SANDBOX_ALLOW_LOCAL_RUNTIME
  • 代码静态检查:SecurityUtils.validate_code 会对常见危险操作告警:bash 场景检测rm -rf /mkfs.dd if=、fork 炸弹、curl | bash等;Python 及其他语言场景检测import ossubprocesseval(exec(socketurllib等敏感模式,并对pickle单独告警。注意该检查仅产生警告列表,实际拦截仍依赖容器隔离与资源限制。
  • 网络隔离:会话配置支持network_disabled,可在安全隔离场景下禁用容器网络。
  • 路径安全PathUtils.ensure_safe_path防止路径遍历攻击,工作目录统一为/workspaceWORKING_DIR)。
  • 超时与资源兜底ExecutionStatus.TIMEOUT/RESOURCE_LIMIT用于标记被终止的执行,避免失控任务长期占用资源。

结语

本文围绕 DB-GPT Sandbox 的官方使用说明展开:完成环境准备后,只需一条./scripts/start_api.sh即可在本地拉起沙箱 API 服务;RuntimeFactory会自动在 Docker → Podman → Nerdctl → Local 之间择优选择,也可通过SANDBOX_RUNTIME强制指定;随后便可通过/api/connect/api/configure/api/execute等接口在隔离环境中执行多语言代码,并利用有状态会话完成依赖安装、环境变更等连续任务。深入阅读 runtime_factory.py、control_layer.py 与 base.py 等源码,可以进一步理解其安全隔离与有状态执行的底层设计,为后续接入 DB-GPT Agent 或扩展自定义运行时打下基础。

【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI + Data products.项目地址: https://gitcode.com/GitHub_Trending/db/DB-GPT

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 8:28:15

AI短漫剧全链路云原生流水线实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 8:25:33

腾讯Agent Suite办公智能体套件:从编排到落地的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 8:23:29

SpringBoot+Vue构建智能废品回收系统实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华