使用AgentSphere智能体沙箱部署OpenClaw
操作场景
随着AI Agent在企业业务中的广泛应用,开发者需要一个安全、隔离的运行环境来部署和调试AI Agent应用。OpenClaw是一款开源的AI Agent网关,支持通过即时通讯软件与大模型进行对话交互,适用于智能客服、企业内部助手等场景。然而,直接在本地或生产服务器上运行OpenClaw存在安全风险和资源管理困难——Agent应用可能执行不可预测的代码操作,与宿主环境共享资源也容易引发冲突。
AgentSphere是华为云提供的AI Agent沙箱运行平台,能够为AI Agent提供安全隔离的代码执行环境。通过将OpenClaw部署在AgentSphere的沙箱中,既可以利用OpenClaw的Agent网关能力,又能借助沙箱的隔离机制保障宿主环境安全。
本文介绍如何在AgentSphere中创建OpenClaw沙箱实例,包括制作自定义镜像、通过E2B SDK创建沙箱以及在浏览器中访问OpenClaw的完整流程。
原理说明
在AgentSphere中创建OpenClaw的整体方案架构如下,分为镜像制作、沙箱创建和访问三个阶段:
- 镜像制作阶段:以OpenClaw官方镜像为基础,集成ENVD守护进程(AgentSphere沙箱的管理组件)和自定义启动脚本,构建自定义镜像,并使用该自定义镜像创建沙箱模板。
- 沙箱创建阶段:通过E2B SDK调用AgentSphere的沙箱服务API,指定自定义模板创建沙箱实例。
- 访问阶段:沙箱创建成功后,通过浏览器访问模板对应的网关域名,并在Header中注入沙箱身份认证信息,即可成功访问沙箱内的OpenClaw服务,进入OpenClaw对话界面。
阶段一:制作自定义镜像
本阶段以OpenClaw官方镜像为基础,集成ENVD守护进程和启动脚本,构建自定义Docker镜像并推送至SWR镜像仓库。
准备OpenClaw基础镜像
OpenClaw官方提供了基础Docker镜像,自定义镜像将以此为基础进行构建。
- 在本地或构建服务器上执行以下命令,拉取OpenClaw最新镜像。
docker pull ghcr.io/openclaw/openclaw:latest
- 验证镜像拉取成功。
docker images | grep openclaw
回显结果中能看到ghcr.io/openclaw/openclaw且TAG为latest,说明镜像拉取成功。
准备OpenClaw配置文件
OpenClaw启动时需要读取openclaw.json配置文件,用于定义Agent工作空间、消息渠道等运行参数。
- 创建openclaw.json文件,最简化配置如下:
{ "agents": { "defaults": { "workspace": "~/.openclaw/workspace" } }, "channels": { "whatsapp": { "allowFrom": ["+155xxxxx"] } } }配置参数说明:
参数
说明
示例值
agents.defaults.workspace
Agent工作空间目录路径,用于存储Agent运行时产生的文件和数据。
~/.openclaw/workspace
channels.whatsapp.allowFrom
允许通过WhatsApp渠道发起对话的手机号码列表。请替换为实际需要授权的号码。
["+155xxxxx"]
- 如需配置大模型对话能力,请在配置文件中补充模型相关参数。
详细配置方法请参考OpenClaw官方文档:https://docs.openclaw.ai/gateway/configuration
编译ENVD二进制
ENVD需要作为容器内的常驻进程运行,因此需要先编译ENVD二进制文件,再集成到自定义镜像中。
前提条件:已安装Go语言编译环境,版本建议1.21+。
- 拉取ENVD代码。
git clone git@github.com:e2b-dev/infra.git
- 进入envd目录,根据目标镜像的CPU架构构建二进制。
cd packages/envd CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o envd main.go
如果需要构建ARM64架构的镜像,请将其中的GOARCH=amd64改为GOARCH=arm64。
- 验证编译结果。执行目录下应生成envd二进制文件。
ls -la envd
编写健康检查脚本
ENVD启动后需要一定时间完成初始化。健康检查脚本通过轮询ENVD的状态接口,确保ENVD完全就绪后再启动业务应用,避免后续操作因ENVD未就绪而失败。
创建envd-healthcheck.sh文件,内容如下:
#!/bin/bash
# Custom health check for ENVD Server
# Verifies the server is responsive via the /health endpoint
MAX_RETRIES=50
RETRY_INTERVAL=0.2
for i in $(seq 1 $MAX_RETRIES); do
status_code=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:49983/health")
if [ "$status_code" -eq 204 ]; then
echo "ENVD Server is healthy"
exit 0
fi
if [ $((i % 10)) -eq 0 ]; then
echo "Waiting for ENVD Server to become healthy... (attempt $i/$MAX_RETRIES)"
fi
sleep $RETRY_INTERVAL
done
echo "ENVD Server health check failed after $MAX_RETRIES attempts"
exit 1 编写entrypoint.sh启动脚本
entrypoint.sh是容器的启动入口脚本,负责按正确顺序启动ENVD守护进程和OpenClaw网关服务。
#!/bin/bash
set -euo pipefail
# 设置默认配置路径(若环境变量未指定则使用默认值)
: "${OPENCLAW_CONFIG_PATH:=/home/node/.openclaw/openclaw.json}"
: "${OPENCLAW_WORKSPACE_DIR:=/home/node/.openclaw/workspace}"
: "${OPENCLAW_BOOTSTRAP_DIR:=/home/node/.openclaw/bootstrap}"
bootstrap_config="${OPENCLAW_BOOTSTRAP_DIR}/openclaw.json"
# 启动ENVD守护进程并进行健康检查
function start_envd() {
sudo -n /opt/openclaw/bin/envd -isnotfc -port 49983 -verbose &
/opt/openclaw/bin/envd-healthcheck.sh
if [ $? -ne 0 ]; then
echo "ENVD Server failed to start, aborting."
exit 1
fi
}
echo "Starting ENVD server..."
start_envd
# 等待下发bootstrap配置文件
while [[ ! -s "${bootstrap_config}" ]]; do
sleep 1
done
# 将下发的配置复制到OpenClaw配置路径
cp "${bootstrap_config}" "${OPENCLAW_CONFIG_PATH}"
# 启动OpenClaw网关服务,绑定局域网
node /app/dist/index.js gateway run --bind lan 脚本执行流程说明:
| 执行阶段 | 操作内容 | 目的 |
|---|---|---|
| 1. 初始化配置路径 | 设置OPENCLAW_CONFIG_PATH等环境变量的默认值。 | 确保脚本在未显式指定路径时使用标准路径。 |
| 2. 启动ENVD | 以sudo权限启动ENVD守护进程,监听49983端口,并执行健康检查。 | ENVD是沙箱环境的核心管理进程,必须先于OpenClaw启动。 |
| 3. 等待配置下发 | 循环检测bootstrap_config文件是否存在且非空。 | 在沙箱启动后下发配置文件,需等待其就绪。 |
| 4. 复制配置 | 将平台下发的配置文件复制到OpenClaw读取路径。 | 使OpenClaw读取到最新配置。 |
| 5. 启动OpenClaw | 执行gateway run --bind lan启动网关服务。 | OpenClaw网关绑定局域网地址,准备接收外部请求。 |
编写Dockerfile并构建镜像
自定义镜像需要在OpenClaw基础镜像上集成ENVD守护进程和启动脚本,使OpenClaw能够在AgentSphere沙箱环境中正常运行。由于OpenClaw镜像以非root用户(node)运行,而ENVD必须以root权限运行,因此需要通过sudoers进行权限适配。
- 在构建目录下创建Dockerfile文件,内容如下:
FROM ghcr.io/openclaw/openclaw:latest USER root # 复制ENVD守护进程及相关脚本到容器内 COPY --chown=node:node envd-healthcheck.sh /opt/openclaw/bin/envd-healthcheck.sh COPY --chown=node:node envd /opt/openclaw/bin/envd COPY --chown=node:node entrypoint.sh /opt/openclaw/bin/entrypoint.sh # 设置OpenClaw运行环境变量 ENV OPENCLAW_GATEWAY_TOKEN="your-custom-gateway-token" ENV OPENCLAW_STATE_DIR="/home/node/.openclaw" ENV OLLAMA_API_KEY="ollama-local" # 安装tini(轻量级init进程,负责信号转发和僵尸进程回收) RUN apt-get update \ && apt-get install -y --no-install-recommends \ tini \ && rm -rf /var/lib/apt/lists/* # 创建OpenClaw运行所需的目录并设置权限 RUN install -d -m 0700 -o node -g node /home/node/.openclaw RUN install -d -m 0700 -o node -g node /home/node/.openclaw/workspace RUN install -d -m 0700 -o node -g node /home/node/.openclaw/bootstrap # 配置sudoers,允许node用户以root权限运行ENVD RUN mkdir -p /etc/sudoers.d RUN echo 'node ALL=(root) NOPASSWD: /opt/openclaw/bin/envd -isnotfc -port 49983 -verbose' \ > /etc/sudoers.d/envd \ && chmod 0440 /etc/sudoers.d/envd # 切回node用户,OpenClaw应用以node身份运行 USER node EXPOSE 49983 ENTRYPOINT ["tini", "-s", "--", "/bin/bash", "/opt/openclaw/bin/entrypoint.sh"]Dockerfile关键配置说明:
配置项
说明
注意事项
OPENCLAW_GATEWAY_TOKEN
OpenClaw网关访问令牌,用户在浏览器中访问OpenClaw时需输入此令牌进行认证。
请将your-custom-gateway-token替换为自定义的令牌值,建议使用高强度随机字符串,该令牌后续在浏览器访问时需要使用。
OPENCLAW_STATE_DIR
OpenClaw状态数据存储目录。
保持默认值即可,需与下方创建的目录路径一致。
OLLAMA_API_KEY
Ollama本地大模型的API密钥。
如使用Ollama作为模型后端,请替换为实际密钥;如使用其他模型服务,请在openclaw.json中配置对应的模型参数。
envd-healthcheck.sh
ENVD健康检查脚本,用于验证ENVD服务是否正常启动。
由前述步骤编写。
envd
ENVD守护进程二进制文件,沙箱环境管理核心组件。
由前述步骤编译生成。
entrypoint.sh
容器启动脚本,负责启动ENVD和OpenClaw网关。
由前述步骤编写。
sudoers配置
允许node用户以root权限运行ENVD,遵循最小权限原则。
请勿配置node ALL=(ALL) NOPASSWD:ALL,仅授予启动ENVD所需的最小权限。如果修改了ENVD路径或启动参数,需同步更新sudoers配置。
EXPOSE 49983
声明ENVD监听端口。
该端口用于沙箱内部通信,浏览器访问时需要通过此端口。
ENTRYPOINT
使用tini作为init进程启动entrypoint.sh。
tini确保容器正确处理信号,避免僵尸进程问题。
- 执行以下命令构建自定义镜像。
docker build -t openclaw-custom:latest .
- 建议在推送前本地运行验证。
docker run --rm -p 49983:49983 openclaw-custom:latest
验证启动日志中出现“ENVD Server is healthy”,且OpenClaw网关正常启动。
推送镜像到SWR
构建并验证通过后,需要将镜像推送到华为云容器镜像服务(SWR),供创建沙箱模板时使用。
以基础版SWR为例,步骤如下:
- 登录SWR控制台,选择左侧导航栏的“组织管理”,单击页面右上角的“创建组织”,创建一个组织。
如已有组织可跳过此步骤。
- 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成登录指令”,单击
复制临时登录指令。 - 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
- 给镜像打上SWR标签。
docker tag openclaw-custom:latest swr.<region>.myhuaweicloud.com/<namespace>/openclaw-custom:latest
其中,swr.<region>.myhuaweicloud.com为镜像仓库地址可在SWR控制台上查询,登录指令中末尾的域名即为镜像仓库地址;<namespace>为SWR中已创建的组织名称。
- 推送镜像到 SWR:
docker push swr.<region>.myhuaweicloud.com/<namespace>/openclaw-custom:latest
推送完成后,可在SWR控制台对应组织的镜像列表中查看到该镜像。
阶段二:创建自定义模板并实例化沙箱
本阶段在AgentSphere控制台创建自定义沙箱模板,获取API Key,然后通过E2B-SDK创建沙箱实例并注入OpenClaw配置。
创建自定义沙箱模板
本步骤在AgentSphere控制台创建基于上一步推送至SWR的自定义镜像的沙箱模板。
- 登录AgentSphere控制台。
- 在左侧导航栏中选择“沙箱模板”,并单击右上角的“创建沙箱模板”。
- 选择沙箱模板类型为自定义沙箱(基于自定义镜像的完全可控开发环境)。
- 填写基础配置。
参数
参数说明
示例
沙箱模板名称
自定义名称,需以小写字母开头,以小写字母或数字结尾,可以包含小写字母、数字和中划线,长度为1-48个字符。
openclaw-template
描述
您可以添加该沙箱模板的描述信息,最多1000字符。
OpenClaw AI Agent网关沙箱模板
选择镜像
单击选择镜像,选择SWR中已推送的自定义镜像。也可直接输入镜像地址。
选择阶段一推送的openclaw-custom:latest
资源配额
选择沙箱实例使用的CPU和内存配比。资源配额过小可能导致沙箱运行失败,过大则导致资源浪费。
根据OpenClaw运行需求选择,建议2vCPU/4GB及以上
沙箱实例配额
设置此沙箱模板创建实例的上限,所有模板实例配额总数上限为10000。
10
启动命令
沙箱实例启动时执行的命令。由于已在Dockerfile中通过ENTRYPOINT指定,此处可留空。
留空
环境变量
通过键值对为沙箱设置环境变量。已在Dockerfile中通过ENV设置,此处可按需补充。
可选
- 填写网络与权限配置。
参数
参数说明
示例
入站(Inbound)网关
入站网关用于接收外部请求,配置后可通过网关访问沙箱内的服务。
如果没有可选网关,请单击“新建入站网关实例”进行创建,完成创建后单击刷新按钮。
必填,浏览器可通过网关域名访问OpenClaw。
选择已有网关实例
出站(Outbound)网络配置
选择公网模式(沙箱可通过公网对外访问,适用于调用第三方API、下载依赖等场景)或VPC模式(沙箱访问VPC内其他服务)。
公网模式(OpenClaw需访问外部大模型API)
运行时信任委托
用于授予OBS桶的访问权限。当配置了OBS对象存储时,此项必填。
选择已配置的信任委托
- 填写日志监控配置(可选)。建议开启日志对接LTS,方便后续排查问题。
- 完成上述配置后,单击“创建”。
模板创建成功后,在模板列表中记录沙箱模板ID,后续创建沙箱时需要使用。
获取API Key
API Key是调用AgentSphere API和SDK的认证凭证,所有通过API或SDK操作沙箱资源的请求均需携带API Key进行身份鉴权。
- 登录AgentSphere控制台。
- 在左侧导航栏中选择“API Key管理”,并单击右上角的“创建API Key”。
- 设置API Key参数。
参数
参数说明
有效期
根据需求设置API Key的有效期,过期后该API Key将不可用。
描述
您可以添加该API Key的描述信息。
- 单击“确定”,系统将自动为您生成API Key。
为保障安全,生成的API Key将仅显示一次,请务必保存,关闭该页面后将无法再次查看。
您可以单击“下载API Key凭证”将API Key保存至本地。
使用E2B SDK创建沙箱
完成自定义模板和API Key准备后,通过E2B SDK的Python接口创建沙箱实例,并将OpenClaw配置文件注入沙箱。
- 确保本地已安装E2B SDK和满足版本要求的Python,版本要求详见e2b-code-interpreter。若未安装SDK,请执行以下命令安装:
pip install e2b-code-interpreter==2.9.1 - 创建Python脚本create_sandbox.py,内容如下:
import os from e2b_code_interpreter import Sandbox from time import sleep # ====== 请替换为AgentSphere控制台获取的真实值 ====== E2B_SANDBOX_URL = "https://<your-sandbox-url>.huaweicloud-agentnetwork.com" E2B_API_URL = "https://agentsphere.<region>.myhuaweicloud.com" E2B_API_KEY = "<your_api_key>" TEMPLATE = "<template_id>" # ================================================ # 创建沙箱实例,指定自定义模板和环境变量 sbx = Sandbox.create( api_key=E2B_API_KEY, api_url=E2B_API_URL, sandbox_url=E2B_SANDBOX_URL, template=TEMPLATE_ID, # 环境变量 envs={ "MY_VAR": "hello", "MY_SECRET": "12345", }, ) print("Sandbox created:", sbx.sandbox_id) print("Sandbox envd_access_token:",sbx._envd_access_token) print("Sandbox traffic_access_token:",sbx.traffic_access_token) # 等待沙箱内部服务启动完成 sleep(10) # 设置流量访问令牌到请求头,用于后续浏览器访问时的身份验证 sbx.connection_config._ConnectionConfig__extra_sandbox_headers["E2b-Traffic-Access-Token"] = sbx.traffic_access_token # 将本地openclaw.json配置文件写入沙箱的bootstrap目录 with open("/home/user/openclaw-app/openclaw.json" , "rb") as fileA: sbx.files.write('/home/node/.openclaw/bootstrap/openclaw.json',fileA, user="node") print("已将配置写入沙箱") # 验证沙箱环境变量是否正确注入 print(sbx.run_code("import os; print(os.environ)").logs.stdout)
代码关键参数说明:
参数
说明
注意事项
E2B_SANDBOX_URL
沙箱服务网关地址,用于浏览器访问时的流量入口。
请替换为AgentSphere控制台中实际分配的网关地址,可在控制台“沙箱模板”详情页查看其入站网关的“公网域名”获取。
E2B_API_KEY
沙箱服务API密钥,用于API调用身份认证。
请替换为实际密钥,注意妥善保管,避免泄露。
E2B_API_URL
沙箱服务API地址,用于SDK与AgentSphere平台通信。
请替换为实际API地址,请通过《AgentSphere SDK参考》“配置本地E2B SDK执行环境”章节查询当前区域的API访问地址。
template
自定义模板ID,决定沙箱的基础镜像和运行环境。
请替换为创建沙箱模板后获取的模板ID。
envs
沙箱环境变量,可在沙箱内部通过os.environ读取。
根据业务需要自定义,非必填。
sleep(10)
等待沙箱内部ENVD和OpenClaw服务启动。
若沙箱启动较慢,可适当增加等待时间。
sbx.files.write(...)
将本地配置文件写入沙箱指定路径。
路径需与entrypoint.sh中bootstrap_config路径一致,user="node"确保文件属主正确。
- 执行脚本创建沙箱。
python create_sandbox.py
- 验证沙箱创建成功。脚本执行后,控制台将输出Sandbox ID和Traffic Access Token,后续浏览器访问时需要使用。
阶段三:在浏览器中访问OpenClaw
沙箱创建成功后,通过浏览器访问OpenClaw对话界面。由于沙箱通过入站网关对外提供服务,浏览器需要通过Modify Header插件注入沙箱身份认证信息才能访问。
- 在浏览器中安装请求头注入插件,用于在请求中注入沙箱身份认证信息。本文使用Modify Header插件。
- 在Modify Header插件中添加以下三个请求头:
Header名称
Header值
说明
E2b-Sandbox-Id
阶段二输出的Sandbox ID
标识目标沙箱实例
E2b-Sandbox-Port
49983
ENVD监听端口,与Dockerfile中EXPOSE一致
E2b-Traffic-Access-Token
阶段二输出的Traffic Access Token
沙箱流量认证令牌
- 在浏览器地址栏中输入沙箱网关域名(即E2B_SANDBOX_URL的值),按Enter键访问。
- 在OpenClaw登录页面中输入网关令牌(即Dockerfile中OPENCLAW_GATEWAY_TOKEN设置的值),单击连接。
- 验证访问成功。若页面显示OpenClaw对话界面,说明已成功访问。若在openclaw.json中配置了大模型,即可在界面中进行对话交互。
常见问题
- Q:浏览器访问OpenClaw提示连接失败怎么办?
A:请依次检查以下内容。
- Modify Header插件中的三个请求头是否填写正确。
- 沙箱是否仍在运行(沙箱有生命周期限制,超时后会自动销毁)。
- 网关令牌是否与Dockerfile中设置的OPENCLAW_GATEWAY_TOKEN一致。
- Q:沙箱创建后ENVD启动失败怎么办?
A:请检查自定义镜像中的envd和envd-healthcheck.sh文件是否正确复制,以及sudoers配置是否允许node用户执行envd命令。可通过docker run本地启动镜像查看entrypoint.sh的输出日志进行排查。
- Q:如何在OpenClaw中配置大模型对话?
A:在openclaw.json配置文件中添加模型相关参数(如API Key、模型名称等),具体配置方法请参考OpenClaw官方文档。配置完成后,重新执行阶段二中的E2B SDK脚本将更新后的配置文件写入沙箱即可。
相关文档
- OpenClaw官方文档:了解OpenClaw网关的完整配置项和功能说明,请参见https://docs.openclaw.ai/gateway/configuration。
- AgentSphere用户指南:了解沙箱模板、沙箱实例、API Key管理等详细操作,请参见沙箱概述。
- 构建沙箱镜像:了解ENVD编译、镜像构建和推送SWR的完整说明,请参见构建沙箱镜像。
- E2B SDK文档:了解沙箱API的完整接口说明,包括代码执行、文件操作等能力,请参见E2B SDK官方文档。