全部產品
Search
文件中心

Function Compute:快照(Snapshot)(邀測)

更新時間:Sep 19, 2026

Snapshot 儲存運行中沙箱的檔案系統與記憶體狀態,可從快照秒級啟動同樣狀態的新沙箱。

功能介紹

Snapshot 功能當前僅支援第二代運行時。

Snapshot 儲存運行中沙箱在某一時刻的檔案系統與記憶體狀態。建立後的 Snapshot 獨立於源沙箱和源模板:刪除源沙箱或源模板不會刪除 Snapshot;刪除 Snapshot 也不會刪除源沙箱或源模板。

典型用法:在沙箱中安裝依賴、準備工作區後建立一份 Snapshot,之後用這份 Snapshot 秒級啟動同樣狀態的新沙箱,而不必重新構建模板。適用於 Agent 任務斷點續跑、環境預熱和並行複製探索等情境。

Snapshot 自建立起預設保留 7 天,到期後自動到期。到期後不再出現在列表中,也不能用於建立沙箱。Snapshot 留存獨立於源沙箱生命週期:源沙箱終止或逾時回收後,未到期的 Snapshot 仍可使用。

通過 E2B 相容 SDK 調用,相容性說明參見E2B 相容說明。認證與串連參數配置參見使用約束。

API 參考

操作

JavaScript / TypeScript

Python

建立

sandbox.createSnapshot({ name? }) / Sandbox.createSnapshot(sandboxId, { name? })

sandbox.create_snapshot(name=...) / Sandbox.create_snapshot(sandbox_id, name=...)

列表

Sandbox.listSnapshots({ sandboxId?, name?, limit?, nextToken? })

Sandbox.list_snapshots(sandbox_id=..., name=..., limit=..., next_token=...)

從 Snapshot 建立沙箱

Sandbox.create(snapshotId | "<TeamName>/<短名>")

Sandbox.create(template=snapshot_id | "<TeamName>/<短名>")

刪除

Sandbox.deleteSnapshot(snapshotId | qualifiedName)

Sandbox.delete_snapshot(snapshot_id | qualified_name)

建立 Snapshot 的執行個體方法與靜態方法語義相同。執行個體方法隱含當前沙箱,無需再傳 sandboxId / sandbox_id。列表與刪除僅提供靜態方法。

返回欄位

欄位

JavaScript

Python

說明

Snapshot ID

snapshotId

snapshot_id

UUID。建立、刪除、從 Snapshot 建立沙箱時優先使用

名稱

names

names

有名:["<當前 Team 名>/<短名>:<tag>"];無名:[]

Snapshot 名稱與 ID 相互獨立。全名僅出現在 names 欄位和按名解析中,不替代 Snapshot ID。

使用限制

  • 僅可對運行中的沙箱建立 Snapshot。源沙箱已暫停、正在建立 Snapshot,或當前被其他動作佔用時,建立 Snapshot 會失敗。

  • 當前僅支援第二代運行時。

  • 有名 Snapshot 要求當前 Team 有名稱;Team 無名時只能建立無名 Snapshot。

  • 建立過程中源沙箱 state 為 snapshotting,此時不可刪除該沙箱。完成後可繼續使用該沙箱,也可再次建立 Snapshot。

  • 建立可能持續數分鐘。SDK 請求逾時建議不少於 300 秒(TypeScript:requestTimeoutMs: 300_000;Python:request_timeout=300)。timeoutMs / timeout 控制的是沙箱生命週期,不是 Snapshot 請求逾時;預設請求逾時通常為 60 秒,不加大時可能在建立完成前失敗。

  • 建立 Snapshot 時源模板必須仍存在。建立成功後,即使之後刪除源模板,仍可用該 Snapshot 恢複沙箱。

建立 Snapshot

name 可選。省略時建立無名 Snapshot,此後僅可通過 Snapshot ID 訪問。

同一 Team 內,同一 (短名, tag) 同時只能存在一份可用 Snapshot,與源模板無關。名稱衝突時建立失敗,不覆蓋已有 Snapshot。不同 tag 可並存。刪除後該名稱立即釋放。

TypeScript

import { Sandbox } from "e2b";

const sandbox = await Sandbox.create("code-interpreter-v1", {
  apiKey: process.env.E2B_API_KEY,
  apiUrl: process.env.E2B_API_URL,
  domain: process.env.E2B_DOMAIN,
  timeoutMs: 300_000,
});

await sandbox.files.write("/app/state.json", '{"step": 1}');

const snapshot = await sandbox.createSnapshot({
  name: "deps-ready",
  requestTimeoutMs: 300_000,
});
// snapshot.snapshotId
// snapshot.names === ["demo-team/deps-ready:default"]

const another = await Sandbox.createSnapshot(sandbox.sandboxId, {
  apiKey: process.env.E2B_API_KEY,
  domain: process.env.E2B_DOMAIN,
  requestTimeoutMs: 300_000,
  name: "deps-ready:v1",
});

Python

import os

from e2b import Sandbox

sandbox = Sandbox.create(
    template="code-interpreter-v1",
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
    timeout=300,
)

sandbox.files.write("/app/state.json", '{"step": 1}')

snapshot = sandbox.create_snapshot(
    name="deps-ready",
    request_timeout=300,
)
# snapshot.snapshot_id
# snapshot.names == ["demo-team/deps-ready:default"]

another = Sandbox.create_snapshot(
    sandbox.sandbox_id,
    name="deps-ready:v1",
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
    request_timeout=300,
)

同一沙箱可建立多份 Snapshot。

名稱規則

全名為 <當前 Team 名>/<短名>:<tag>。

  • 短名、tag:^[_a-zA-Z][-_a-zA-Z0-9]*$,最長 64。必須以字母或底線開頭。

  • Team 名首碼:與 Team 展示名相同,最長 32;允許數字開頭,以及空格、點、底線、連字號(例如預設 Team 的數字名、My Team)。

  • 段內不得包含 / 或 :。Team 名和模板名都不允許 /,因此含且僅含一個 / 的字串只可能是 Snapshot 全名,不會和模板名衝突。

name

結果

省略 / 空

無名。names = [],僅可通過 Snapshot ID 訪問

deps-ready

<當前 Team 名>/deps-ready:default

deps-ready:v1

<當前 Team 名>/deps-ready:v1

demo-team/deps-ready

demo-team/deps-ready:default。首碼必須等於當前 Team 名(大小寫不敏感)

demo-team/deps-ready:v1

demo-team/deps-ready:v1

按名建立、恢複或刪除時,省略 tag 等價於 default。

列出 Snapshot

返回當前 Team 未刪除且未到期的 Snapshot,按建立時間倒序。

建立成功後立即調用列表介面時,由於索引延遲,可能暫時看不到剛寫入的記錄。按 Snapshot ID 或全名恢複沙箱、刪除 Snapshot 均不受影響,可直接使用建立介面返回的 snapshotId / names。

TypeScript

const paginator = Sandbox.listSnapshots({
  apiKey: process.env.E2B_API_KEY,
  domain: process.env.E2B_DOMAIN,
});
const snapshots = [];
while (paginator.hasNext) {
  snapshots.push(...(await paginator.nextItems()));
}

Sandbox.listSnapshots({
  apiKey: process.env.E2B_API_KEY,
  domain: process.env.E2B_DOMAIN,
  sandboxId: sandbox.sandboxId,
});
Sandbox.listSnapshots({
  apiKey: process.env.E2B_API_KEY,
  domain: process.env.E2B_DOMAIN,
  name: "deps-ready",
});

Python

paginator = Sandbox.list_snapshots(
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
)
snapshots = []
while paginator.has_next:
    snapshots.extend(paginator.next_items())

Sandbox.list_snapshots(
    sandbox_id=sandbox.sandbox_id,
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
)
Sandbox.list_snapshots(
    name="deps-ready",
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
)

參數

說明

sandboxId / sandbox_id

按源沙箱過濾

name

可解析為短名或全名時按段匹配。省略 tag 匹配該名下全部 tag;:v1 或尾部 : 匹配指定 tag。無法解析時對全名做不區分大小寫包含匹配。

limit

每頁條數,預設 100,最大 100

nextToken / next_token

分頁遊標

無名 Snapshot 的 names 為空白,name 過濾不會命中。TypeScript 的 listSnapshots / createSnapshot / deleteSnapshot 靜態調用請通過環境變數配置 E2B_API_URL,不要傳入不受支援的 apiUrl 欄位。

從 Snapshot 建立沙箱

Sandbox.create 的模板參數可以是 Snapshot ID,也可以是有名 Snapshot 的全名。完整建立參數說明參見建立沙箱。

TypeScript

await Sandbox.create(snapshot.snapshotId, {
  apiKey: process.env.E2B_API_KEY,
  apiUrl: process.env.E2B_API_URL,
  domain: process.env.E2B_DOMAIN,
  timeoutMs: 300_000,
});

await Sandbox.create("demo-team/deps-ready", {
  apiKey: process.env.E2B_API_KEY,
  apiUrl: process.env.E2B_API_URL,
  domain: process.env.E2B_DOMAIN,
  timeoutMs: 300_000,
});

Python

Sandbox.create(
    template=snapshot.snapshot_id,
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
    timeout=300,
)

Sandbox.create(
    template="demo-team/deps-ready",
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
    timeout=300,
)

解析規則:

  1. <Team 名>/<短名> 或 <Team 名>/<短名>:<tag>:僅作為 Snapshot 全名。未找到則失敗,不會回退為模板。

  2. 含 / 但形態不合法:失敗。

  3. 不含 /:值為 UUID 時先按 Snapshot ID 尋找,未命中則按模板名建立;非 UUID 的普通模板名直接按模板名建立。

允許覆蓋:逾時、空閑逾時、secure、allowInternetAccess、使用者 metadata、autoPause、autoResume、網路、自訂沙箱 ID。

不允許覆蓋(傳入則失敗):環境變數、卷 / 檔案系統掛載、函數配置、構建 / 鏡像、fc. 首碼的系統 metadata。

從 Snapshot 建立的沙箱會佔用該 Snapshot。佔用期間刪除該 Snapshot 會失敗。

已到期或已刪除的 Snapshot 不能用於建立沙箱。建立 Snapshot 之後刪除源模板,仍可用該 Snapshot 恢複。

刪除 Snapshot

參數為一個字串:Snapshot ID,或 names 中的全名。刪除成功返回 true,不存在返回 false。

參數

行為

Snapshot ID(UUID)

按 ID 刪除

全名(demo-team/deps-ready 或 demo-team/deps-ready:default)

按全名刪除

短名(deps-ready,不含 /)

不按 Snapshot 名稱刪除。先按 ID 尋找,未命中則按模板名刪除

非法全名(多個 /、空段等)

失敗,不會回退為刪除模板

TypeScript

await Sandbox.deleteSnapshot(snapshot.snapshotId, {
  apiKey: process.env.E2B_API_KEY,
  domain: process.env.E2B_DOMAIN,
});
await Sandbox.deleteSnapshot(snapshot.names[0], {
  apiKey: process.env.E2B_API_KEY,
  domain: process.env.E2B_DOMAIN,
});

Python

Sandbox.delete_snapshot(
    snapshot.snapshot_id,
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
)
Sandbox.delete_snapshot(
    snapshot.names[0],
    api_key=os.environ["E2B_API_KEY"],
    api_url=os.environ["E2B_API_URL"],
    domain=os.environ["E2B_DOMAIN"],
)
  • Snapshot 仍被已恢複沙箱佔用:刪除失敗。

  • 刪除 Snapshot 不刪除源模板或源沙箱;刪除源沙箱或源模板不刪除 Snapshot。

按全名刪除時,請使用建立或列表返回的 names[0],或當前 Team 名拼出的全名。不要只傳短名。

源沙箱狀態

state

說明

snapshotting

正在建立 Snapshot。預設沙箱列表包含此狀態。此時不可刪除該沙箱

snapshot_failed

建立 Snapshot 失敗。預設沙箱列表不含此狀態,須按該狀態過濾。沙箱可刪除

建立失敗後,源沙箱仍可使用或刪除。

常見問題

條件

結果

源沙箱不存在或不屬於當前調用方

建立失敗

沙箱運行時不是 MicroVM

建立失敗

名稱非法,或全名首碼不是當前 Team 名

建立失敗

Team 無名卻傳入 name

建立失敗

同名同 tag 已存在

建立失敗,不覆蓋

源沙箱已暫停、正在建立 Snapshot,或當前被其他動作佔用

建立失敗

從 Snapshot 建立時覆蓋環境變數、掛載或鏡像

建立失敗

Snapshot 仍被已恢複沙箱佔用

刪除失敗

按全名恢複或刪除但 Snapshot 不存在

失敗,不回退為模板

建立逾時

建立失敗,但服務端可能已建成 Snapshot。先增大 requestTimeoutMs / request_timeout。有名 Snapshot:按 name 或全名列表確認後再決定是否重試,避免重複建立。無名 Snapshot:name 過濾無效,應先按源沙箱 sandboxId 列表核對;若已存在目標 Snapshot,直接使用其 ID,不要無條件重試

使用建議

  • 優先儲存建立返回的 Snapshot ID;有名 Snapshot 同時儲存 names[0],便於按名恢複和刪除。

  • 需要在最長 7 天內重複啟動同一工作區狀態的沙箱時使用 Snapshot;僅需短暫暫停任務時,優先使用暫停與恢複。

  • 不用的 Snapshot 及時刪除,避免持續產生儲存費用。

  • 從 Snapshot 恢複後,仍應在任務結束時調用 sandbox.kill() 釋放沙箱資源。