Sandbox 处于运行中状态时,可通过追加挂载接口增加 AgenticBucket 挂载,无需重新创建 Sandbox。
功能介绍
Sandbox 处于运行中(running)状态时,可以增加 AgenticBucket 挂载,无需重新创建 Sandbox。追加时可以直接提供 AgenticBucket 挂载配置,也可以按名称引用已有 AgenticBucket Volume。
本文介绍如何在 Sandbox 运行中追加挂载 AgenticBucket。创建 Sandbox 时直接提供挂载配置的方法,参见动态挂载 AgenticBucket。
适用范围
Sandbox 处于运行中状态。已暂停的 Sandbox 需要先恢复运行。
请求使用的 API Key 与目标 Sandbox 属于同一 Team。
已创建 AgenticBucket,并确定其下需要访问的 BucketSpace 完整名称。BucketSpace 无需预先创建;首次挂载时如果不存在,系统会自动创建。
Sandbox 已配置 RAM(Resource Access Management,访问控制)角色,且该角色具备目标 AgenticBucket 和 BucketSpace 的访问权限。
已获取 AgenticBucket 所在地域的 OSS Endpoint。同地域访问建议使用内网 Endpoint,不需要额外配置 VPC(Virtual Private Cloud,专有网络)。
引用已有 Volume 时,已在同一 Team 中创建 AgenticBucket Volume,并获取可用 Volume 的名称。
追加挂载沿用 Sandbox 当前的 RAM 角色。追加接口不会设置或更换角色;引用已有 Volume 时,其 mountConfig.role 也不会替换当前角色。创建 Sandbox 时的角色配置方法参见配置 RAM 角色。
存储权限策略参见创建 AgenticBucket Volume中的“配置存储访问权限”。第二代运行时的客户端要求参见挂载 AgenticBucket Volume。
Sandbox 通过 RAM 角色获取 STS(Security Token Service,安全令牌服务)临时凭证,无需关闭 AgenticBucket 的 BlockPublicAccess,也不需要在代码或挂载配置中提供长期 AK/SK。追加挂载不会扩大 RAM 角色的授权范围。
接口与参数
POST /sandboxes/{sandboxID}/fc-volume-mounts请求头需要提供 X-API-Key 和 Content-Type: application/json。接口成功时返回 204 No Content,响应体为空。
请求体支持直接提供挂载配置和引用已有 Volume,两种方式可以在同一次请求中组合使用:
字段 | 类型 | 是否必填 | 说明 |
| 对象 | 与 | 直接提供 AgenticBucket 挂载配置,字段见下表。 |
| 对象数组 | 与 | 按名称引用已有 Volume。 |
| 字符串 | 引用 Volume 时必填。 | 同一 Team 中的 Volume 名称,不使用 Volume ID。 |
| 字符串 | 引用 Volume 时必填。 | Sandbox 内的本地挂载目录。 |
请求至少需要包含一个有效挂载点。追加请求中的挂载配置是 JSON 对象,不使用创建 Sandbox 时的 metadata 或 JSON 字符串格式。注意字段大小写:创建时的 metadata 键为 fc.sandbox.storage.agenticbucket,追加请求中的字段为 agenticBucket。
AgenticBucket 挂载参数
以下字段位于 inlineVolumeMounts.agenticBucket 中;选择直接提供挂载配置时,按表中要求填写:
字段 | 类型 | 是否必填 | 说明 |
| 对象数组 | 是 | 本次请求的 AgenticBucket 挂载点列表,包含 1~5 个挂载点;已有与新增 AgenticBucket 挂载点累计不能超过 5 个。 |
| 字符串 | 是 | AgenticBucket 完整名称。 |
| 字符串 | 是 | AgenticBucket 下的 BucketSpace 完整名称。 |
| 字符串 | 否 | BucketSpace 内路径;缺失时默认为 |
| 字符串 | 是 | OSS Endpoint,应与 AgenticBucket 所在地域和网络环境匹配。 |
| 字符串 | 是 | Sandbox 内的本地挂载目录,须符合使用限制中的目录要求。 |
| 布尔值 | 否 | 是否只读挂载;缺失时默认为 |
本地挂载目录
mountDir 和 namedVolumeMounts[].path 表示 Sandbox 内的本地挂载目录,与 BucketSpace 内路径 bucketPath 分别配置。建议使用 /home、/mnt、/tmp 或 /data 的子目录,目录限制参见使用限制。
安装 SDK
示例使用 httpx 调用追加挂载接口,成功后通过 E2B SDK 连接已有 Sandbox,验证文件读写。
pip install e2b==2.31.0 httpx环境变量说明
环境变量 | 用途 | 取值来源或填写方式 |
| 调用智能体沙箱接口的 API Key。 | 在智能体沙箱控制台获取,使用目标 Team 的 API Key。 |
| 智能体沙箱 E2B API 地址。 |
|
| SDK 访问 Sandbox 的域名。 |
|
| 接收追加挂载请求的 Sandbox ID。 | 从创建 Sandbox 的响应或 Sandbox 列表中获取。 |
| AgenticBucket 完整名称。 | 在 OSS 控制台的 AgenticBucket 详情中获取。 |
| 要挂载的 BucketSpace 完整名称。 | 使用已有 BucketSpace 的完整名称,或指定首次挂载时要创建的名称。 |
| AgenticBucket 所在地域的 OSS 内网 Endpoint。 |
|
AGENTIC_BUCKET_NAME、BUCKET_SPACE_NAME 和 OSS_ENDPOINT 是存储类型专用的环境变量,仅在直接提供挂载配置时使用。引用已有 Volume 时,无需设置这三个变量。
追加挂载示例
在本地终端设置连接信息,将占位符替换为实际值:
export E2B_API_KEY="<YOUR-E2B-API-KEY>"
export E2B_API_URL="https://api.<REGION>.sandbox.aliyuncs.com"
export E2B_DOMAIN="<REGION>.sandbox.aliyuncs.com"
export SANDBOX_ID="<SANDBOX-ID>"以下代码在本地运行,通过 SDK 访问 Sandbox 内的文件。示例会创建带随机标识的独立测试文件,写入并读取校验后删除该文件,保留当前 Sandbox。请使用允许读写的挂载配置;仅允许读取时,按验证挂载调整验证代码。
Sandbox.connect() 会更新 Sandbox 的超时时间。示例通过 timeout=300 将连接后的超时时间设为 300 秒,可按任务需要调整。
两种方式任选其一,也可以在同一次请求中组合使用:
直接提供挂载配置:在请求体的
inlineVolumeMounts.agenticBucket中给出 AgenticBucket 挂载参数。引用已有 Volume:在请求体的
namedVolumeMounts中按名称引用同一 Team 中的 Volume。
直接提供挂载配置
以下示例将 BucketSpace 的根目录追加到 /mnt/agentic-bucket,并设置 readOnly=False 以验证读写。请确认 RAM 角色也具备对应存储的读写权限。
export AGENTIC_BUCKET_NAME="<AGENTIC-BUCKET-FULL-NAME>"
export BUCKET_SPACE_NAME="<BUCKET-SPACE-FULL-NAME>"
export OSS_ENDPOINT="https://oss-<REGION>-internal.aliyuncs.com"将以下代码保存为 append_agentic_bucket.py,确认 mount_dir 未被已有挂载占用:
import os
from uuid import uuid4
import httpx
from e2b import Sandbox
def require_env(name: str) -> str:
value = os.environ.get(name, "").strip()
if not value:
raise RuntimeError(f"缺少环境变量: {name}")
return value
def verify_read_write(sandbox: Sandbox, mount_dir: str) -> None:
marker_path = f"{mount_dir}/mount-check-{uuid4().hex}.txt"
expected = f"append mount check {uuid4().hex}\n"
sandbox.files.write(marker_path, expected)
try:
content = sandbox.files.read(marker_path)
if content != expected:
raise RuntimeError(f"文件内容校验失败: {marker_path}")
finally:
sandbox.files.remove(marker_path)
print(f"读写校验通过,测试文件已删除: {mount_dir}")
api_key = require_env("E2B_API_KEY")
api_url = require_env("E2B_API_URL").rstrip("/")
domain = require_env("E2B_DOMAIN")
sandbox_id = require_env("SANDBOX_ID")
mount_dir = "/mnt/agentic-bucket"
payload = {
"inlineVolumeMounts": {
"agenticBucket": {
"mountPoints": [{
"agenticBucket": require_env("AGENTIC_BUCKET_NAME"),
"bucketName": require_env("BUCKET_SPACE_NAME"),
"bucketPath": "/",
"endpoint": require_env("OSS_ENDPOINT"),
"mountDir": mount_dir,
"readOnly": False,
}],
},
},
}
response = httpx.post(
f"{api_url}/sandboxes/{sandbox_id}/fc-volume-mounts",
headers={"X-API-Key": api_key},
json=payload,
timeout=120.0,
)
if response.status_code != 204:
raise RuntimeError(f"追加挂载失败: HTTP {response.status_code}, {response.text}")
sandbox = Sandbox.connect(
sandbox_id,
timeout=300,
api_key=api_key,
api_url=api_url,
domain=domain,
)
verify_read_write(sandbox, mount_dir)运行示例:
python append_agentic_bucket.py引用已有 Volume
已有 AgenticBucket Volume 时,首次运行前将上述脚本中的 payload 定义替换为以下内容,其他代码保持不变。请将 name 替换为同一 Team 中的 Volume 名称,读写校验要求该 Volume 允许读写。
payload = {
"namedVolumeMounts": [{
"name": "agentic-bucket-workspace",
"path": mount_dir,
}],
}每次运行一个示例脚本。同一个挂载目录不能重复追加;挂载已成功但校验失败时,只需重新执行连接和验证代码,不要再次提交追加请求。
直接提供挂载配置与引用已有 Volume 组合使用时,将两种配置放入同一个请求体,并为每个挂载点指定不同的本地挂载目录。引用 Volume 的完整操作和多卷示例参见追加挂载 Volume。
验证挂载
示例仅在接口返回 204 后连接 Sandbox 并验证文件读写。输出“读写校验通过,测试文件已删除”表示写入、内容比对和删除均已完成。
只读挂载仅验证读取。直接提供挂载配置时,将 readOnly 设为 True;引用 Volume 时,使用已有的只读 Volume。首次运行前,将示例末尾的 verify_read_write(sandbox, mount_dir) 替换为以下代码,并把 <EXISTING-FILE> 替换为挂载目录中已存在的文件相对路径。新建的 BucketSpace 可能为空,读取验证需要已有文件。
file_path = f"{mount_dir}/<EXISTING-FILE>"
content = sandbox.files.read(file_path, format="bytes")
print(f"读取成功: {file_path},{len(content)} 字节")引用 Volume 的挂载还可以在连接成功后通过 SDK 查询:
print(sandbox.get_info().volume_mounts)SDK 的 volume_mounts 对应 GET /sandboxes/{sandboxID} 响应中的 volumeMounts。直接提供挂载配置新增的挂载不会出现在该字段中,需要通过文件访问验证。目录存在不代表数据访问正常。
行为说明
释放 Sandbox 不会删除 BucketSpace 中的数据。测试文件和任务数据需要通过存储服务或挂载目录单独清理。
使用限制
本地挂载目录必须是规范化的绝对 Unix 路径,不能为
/,不能包含前后空格、.、..或重复的路径分隔符。不能使用
/bin、/opt、/var、/dev等系统目录及其子目录,也不能包含.cache等隐藏目录。如需通过隐藏目录访问数据,可挂载到符合要求的目录后,再创建指向挂载目录的符号链接。同一个 Sandbox 中的本地挂载目录不能重复,包括不同存储类型的挂载目录。
接口只增加挂载,不支持卸载或替换。需要移除已有挂载时,应释放并重新创建 Sandbox。请求中省略已有挂载不会删除它,重复提交同一个挂载会返回
400。已有与新增 AgenticBucket 挂载点累计最多 5 个,不能只按本次请求中的数量计算。
AgenticBucket、BucketSpace、OSS Endpoint 和 Sandbox 应使用匹配的地域与网络环境。
不要并发更新同一个 Sandbox 的挂载。
常见问题
请求被 API Key 策略拒绝
错误消息为 request is not allowed by API key policy 时,检查 API Key 策略是否允许本次挂载方式和存储类型,参见API Key 管理。这类拒绝发生在接口授权阶段,调整存储 RAM 角色不能解决。
按名称挂载时提示找不到 Volume
核对请求中的 Volume 名称、API Key 所属 Team 和 API 地址的地域,确认使用同一 Team 中的 Volume 名称,而非 Volume ID。详细说明参见追加挂载 Volume。
按名称挂载时提示 Volume 不可用
通过 GetVolume 查询 Volume 的状态和状态原因,确认处于可用状态后再挂载;存在失败原因时,先处理该原因。详细说明参见追加挂载 Volume。
追加挂载提示 Sandbox 未运行
错误消息为 sandbox must be running 时,确认目标 Sandbox 已进入 running 状态。已暂停的 Sandbox 需先恢复运行;已释放的 Sandbox 需重新创建。
追加挂载提示缺少 RAM 角色
错误消息包含 FC Function execution Role is required,表示当前 Sandbox 未配置所需的 RAM 角色。追加接口沿用当前角色,不会从新增 Volume 的 mountConfig.role 为 Sandbox 设置角色。
需要准备具备目标存储访问权限的角色,并在重新创建 Sandbox 时配置。具体方法参见配置 RAM 角色。
追加挂载提示目录重复
错误消息包含 duplicate mount path 或 duplicate mount dir 时,检查本次请求内是否有重复的本地挂载目录,以及目录是否已被 Sandbox 中的其他挂载占用。不同存储类型也不能共用同一个本地挂载目录。
已有挂载无需再次提交;新增挂载应使用未占用的目录。追加接口不能覆盖或替换已有挂载。
本次只追加一个挂载点,为什么仍提示数量超限
挂载数量按 Sandbox 中已有和本次新增的挂载累计计算,直接提供挂载配置和引用已有 Volume 的挂载都需计入。不能只检查本次请求的数量。
按本文使用限制核对相应存储类型的挂载数量。达到上限时,可将新增存储挂载到另一个 Sandbox;更换本地挂载目录不会减少已有挂载数量。
若问题仍未解决,或接口提示服务暂时不可用,请保留完整错误信息和请求 ID,联系产品支持。