- ブランチまたはステージング環境で作業します。このガイドのコード移行を終えてから、本番は 1 回のデプロイで切り替えます。
- 切り替えには短い停止時間が発生します。新しいイメージが古いイメージを置き換えると、実行中のプロセス、ターミナル、その他のコンテナ作業は止まります。
- Worker 内の呼び出し箇所を洗い出します。
- コマンド:
exec、execStream、startProcess、文字列の kill シグナル、プロセスの stdin - セッションとトランスポート:
createSession、enableDefaultSession、SANDBOX_TRANSPORT、setTransport - ターミナル:
sandbox.terminal、セッションのterminal()、xterm のsessionId - インタープリター: 素の
Sandbox上のcreateCodeContext/runCode - Git:
gitCheckout
- コマンド:
安定版のクリーンアップ(RPC トランスポート、exposePort、ストリームヘルパー)が先に必要な場合は、2026 deprecation migration を完了してから、このガイドに戻ってください。
| 安定版の API | プレビューでの対応 |
|---|---|
SANDBOX_TRANSPORT、getSandbox() の transport、setTransport() |
削除します。プレビューは RPC を自動で使うため、トランスポート設定は不要です。 |
await sandbox.exec(string) → バッファ済みの結果 |
await sandbox.exec(argv) のあと await process.output(...) です。 |
execStream、startProcess、プロセスログのヘルパー |
プロセスハンドル: logs、kill、waitFor*。 |
デフォルトセッション / enableDefaultSession |
ありません。各 exec は独立しています。 |
createSession / ExecutionSession |
コアの公開 API からなくなりました。exec ごとに cwd / env を渡すか、1 本のシェル argv スクリプトにします。 |
Sandbox 上のインタープリターメソッド |
withInterpreter のあと、同じメソッド名を sandbox.interpreter で使います。runCode は素の ExecutionResult を返します。Code interpreter を参照してください。 |
| 文字列の kill シグナル | process.kill では数値シグナルです。 |
waitForPort のデフォルトモード |
プレビューのデフォルトは tcp です。HTTP チェックには mode: "http" を渡します。 |
| プロセス / ストリームの stdin | ハンドルにプロセス stdin はありません。非対話は argv / cwd / env。対話 PTY は ターミナル です。 |
sandbox.terminal(request) / セッションの terminal() |
createTerminal のあと terminal.connect(request) です。 |
xterm の sessionId |
terminalId(任意で cursor)です。 |
sandbox.gitCheckout(...) |
削除されました。git は argv の exec で実行します。例: ['git', 'clone', '--', url, dir]。必要に応じて output() / 待機を使います。 |
ファイル、マウント、バックアップ、ポート、トンネル、proxyToSandbox、およびほとんどのライフサイクルオプションはそのまま使えます。シグネチャは本編の Sandbox ドキュメントを参照してください。安定版のページがセッション、トランスポート選択、文字列の exec ヘルパー、または sandbox.terminal を説明している場合は、このプレビューの説明を優先してください。
npm i @cloudflare/sandbox@nextyarn add @cloudflare/sandbox@nextpnpm add @cloudflare/sandbox@nextbun add @cloudflare/sandbox@nextlockfile が @cloudflare/sandbox をプレビュービルドに解決していることを確認します。Dockerfile は、対応するプレビューイメージ(例: cloudflare/sandbox:next、または利用中の -python などのバリアント)を指すようにします。
プレビューの Worker パッケージと安定版のコンテナイメージを混ぜないでください。逆も同じです。両方とも同じ @next 系列である必要があります。
SANDBOX_TRANSPORT、getSandbox() の transport オプション、SandboxTransport 型、sandbox.setTransport() を削除します。代わりの設定は不要です。
安定版:
const result = await sandbox.exec("npm test");
console.log(result.stdout, result.exitCode);プレビュー:
const process = await sandbox.exec(["/bin/bash", "-lc", "npm test"]);
const result = await process.output({ encoding: "utf8" });
console.log(result.stdout, result.exitCode);const process = await sandbox.exec(["/bin/bash", "-lc", "npm test"]);
const result = await process.output({ encoding: "utf8" });
console.log(result.stdout, result.exitCode);ルール:
await sandbox.exec(...)は 起動に成功した ことを意味し、コマンドが終わった ことではありません。- 単一バイナリを実行する場合は、シェルなしの argv を優先します。
cwdを指定して['npm', 'test']とします。 output()のデフォルトは バイト ストリーム(Uint8Array)です。文字列が必要なときは{ encoding: "utf8" }を渡します。- 現在のプレビュー先端には、
sandbox.run()互換ヘルパーはありません。
const server = await sandbox.exec(["/bin/bash", "-lc", "npm run dev"], {
cwd: "/workspace/app",
});
// Default readiness mode is TCP. Use mode: "http" when you need an HTTP check.
await server.waitForPort(3000, { timeout: 60_000 });
// await server.waitForPort(3000, { mode: "http", path: "/health", timeout: 60_000 });
const stream = await server.logs({ follow: true, replay: true });
// consume stream...
await server.kill(); // numeric signal; default 15const server = await sandbox.exec(["/bin/bash", "-lc", "npm run dev"], {
cwd: "/workspace/app",
});
// Default readiness mode is TCP. Use mode: "http" when you need an HTTP check.
await server.waitForPort(3000, { timeout: 60_000 });
// await server.waitForPort(3000, { mode: "http", path: "/health", timeout: 60_000 });
const stream = await server.logs({ follow: true, replay: true });
// consume stream...
await server.kill(); // numeric signal; default 15プロセスハンドルの詳細(待機、ログイベント、kill、stdin なし)は Processes API を参照してください。
Worker リクエストをまたぐ場合は、server.id を保持し、そのプロセスが現在のコンテナでまだ動いているあいだだけ getProcess(id) で再開します。コンテナが止まっていると、getProcess は null を返すことがあります。以前のコンテナのハンドルを持っている場合は、古いハンドルのエラーになります。どちらの場合も、まだ実行する必要がある作業から新しい exec を開始します。プロセスの生存期間 を参照してください。
| 安定版 | プレビュー |
|---|---|
exec("cd /app"); exec("npm test"); |
exec(['/bin/bash', '-lc', 'cd /app && npm test']) または exec(['npm', 'test'], { cwd: '/app' }) |
| デフォルトセッションで export した変数 | 各 exec の setEnvVars および / または env |
createSession({ env }) |
各 exec / createTerminal の setEnvVars および / または env |
詳細は Environment variables を参照してください。
setEnvVars や起動時の env に、本番の API キーや長期のプロバイダークレデンシャルを入れないでください。シークレットは Worker に置き、プロセスが外部 API を呼ぶ必要があるときは outbound traffic ハンドラーで注入します。
| 目的 | API |
|---|---|
| プロセスの生存時間を制限する | exec(argv, { timeout }) — timedOut: true で終わることがあります |
| 待機時間を制限する | output / 待機 / logs のオプションまたは AbortSignal — プロセスは 殺しません |
createSession、getSession、deleteSession、およびコア呼び出しの sessionId オプションを削除します。
ユーザー分離は、1 つのサンドボックス内のセッションではなく、ユーザーごと(または信頼境界ごと)に 1 つのサンドボックス のままです。
Code interpreter を参照してください。最小構成は次のとおりです。
import { Sandbox as BaseSandbox } from "@cloudflare/sandbox";
import { withInterpreter } from "@cloudflare/sandbox/interpreter";
export class Sandbox extends BaseSandbox {
interpreter = withInterpreter(this);
}import { Sandbox as BaseSandbox } from "@cloudflare/sandbox";
import { withInterpreter } from "@cloudflare/sandbox/interpreter";
export class Sandbox extends BaseSandbox<Env> {
interpreter = withInterpreter(this);
}Python を実行する場合は -python イメージバリアントを使います。Worker パッケージとコンテナイメージは同じ @next 系列に揃えます。
sandbox.gitCheckout は削除されました。argv の exec で clone または fetch します。例:
const clone = await sandbox.exec(
["git", "clone", "--depth", "1", "--", repoUrl, "/workspace/repo"],
{ cwd: "/workspace" },
);
const result = await clone.output({ encoding: "utf8" });const clone = await sandbox.exec(
["git", "clone", "--depth", "1", "--", repoUrl, "/workspace/repo"],
{ cwd: "/workspace" },
);
const result = await clone.output({ encoding: "utf8" });安定版の sandbox.terminal(request)(およびセッションスコープの terminal())を、プレビューのターミナルリソース API に置き換えます。
const terminal = await sandbox.createTerminal({ command: ['bash'], ... })terminal.idをサンドボックス ID と一緒に保存します。- WebSocket アップグレード時:
getTerminal(id)のあとterminal.connect(request, { cursor?, cols?, rows? })。 - ブラウザでは、
@cloudflare/sandbox/xtermはterminalIdを使います。
詳細は Terminals、Terminals API を参照してください。
このガイドは @next 上の Worker SDK アプリケーション向けです。
自己デプロイの Sandbox bridge は安定版のままです。Worker パッケージ、コンテナイメージ、HTTP クライアントは、対応する安定版に揃えてください。bridge のデプロイと @cloudflare/sandbox@next を組み合わせないでください。
@next では サンドボックス ID は安定しますが、背後の コンテナ は置き換わることがあります。プロセスとターミナルは、現在のコンテナにだけ存在します。置き換え後、古いハンドルは失敗するので、作業をやり直します。
アイドル、再起動、今回の移行切り替えのあとに起きる、通常の動きです。全体のモデルは Sandbox lifecycle と プロセスの生存期間 です。復旧パターンは Errors and recovery です。カタログは Errors API です。
長時間実行の作業を移行するとき:
- 保存した
process.idやterminal.idだけでは、任意の遅延後やデプロイ後に再開できないと考えます。 - 再起動に必要なコマンド、
cwd、env、およびアプリのチェックポイントを永続化します。 - 後続のリクエストでは、そのリソースが現在のコンテナでまだ動いている可能性があるときだけ
getProcess(id)/getTerminal(id)を呼びます。nullまたは古いハンドルのエラーになったら、保存した作業からやり直します。
少なくとも次のエラーは次のように扱います。
| エラー | 対応 |
|---|---|
ContainerUnavailableError |
コンテナが作業を開始できなかった — バックオフ(retryAfterMs があるときはそれを使う)してから、作業を再試行します |
StaleProcessHandleError / StaleTerminalHandleError |
以前のコンテナです — 保存した作業状態からやり直します |
OperationInterruptedError |
作業は始まっている可能性があります — reason / retryable を読み、繰り返す前に状態を確認します |
RPCTransportError |
呼び出し中に切断されました — 後続の呼び出しは成功することがあります。この呼び出しはすでに実行済みの場合があります |
ProcessWaitTimeoutError / ProcessAbortedError |
待機が終わっただけです — プロセスはまだ動いていることがあります |
RuntimeControlProtocolError、またはデプロイ後に使えないイメージ |
Worker パッケージとコンテナイメージを同じ @next 系列に揃えます。遅い起動としては扱わないでください |
getProcess / getTerminal / list* はコンテナを起動しません。実行中のものがないときは例外ではなく null または [] を返します。
このガイドのコード移行は、先にブランチで終えます。本番の切り替えは、プレビューの Worker パッケージと対応するコンテナイメージを 1 回デプロイすることです。
安定版 Sandbox と @next は、制御プロトコルが異なります。混在ペアはどちらの方向でも動きません。新しい Worker コードと古いコンテナイメージ、古い Worker コードと新しいコンテナイメージは、どちらも失敗します。
通常の wrangler deploy では、Worker コードはすぐに有効になりますが、コンテナインスタンスは段階的に更新されることがあります。そのあいだ、新しい Worker コードが古いコンテナに届く窓が残ります。この移行では、コンテナを 1 ステップでロールアウトします。
npx wrangler deploy --containers-rollout=immediate--containers-rollout=immediate は rollout_active_grace_period を上書きしません。切り替え時はこの設定をデフォルトの 0 のままにします(以前上げていた場合は 0 に戻します)。0 以外の猶予期間だと、新しい Worker がすでに稼働しているあいだ、稼働中の古いコンテナが長く対象に残り続けます。
本番の前に:
- 切り替えをまたいで残したい作業を終えるか、止めます。
- 前の節の、即時コンテナロールアウトのコマンドでデプロイします。
- 新しいコンテナイメージがトラフィックを処理するまで待ちます。
- デプロイ前のプロセス ID とターミナル ID は無効として扱います。その作業をやり直し、新しい ID を保持します。
- 確認する のチェックを実行します。
移行後の通常デプロイは Deploy a Sandbox application を参照してください。ロールアウトオプションは Rollouts を参照してください。
- lockfile と Dockerfile が同じ
@next系列にあることを確認し、--containers-rollout=immediateでデプロイします。 - argv の
execを 1 回実行し、output({ encoding: "utf8" })します。 waitForPortまたはlogsを使い、長時間実行のプロセスを 1 つ動かします。- アプリがブラウザターミナルを使う場合: コンテナにまだあるあいだに作成、接続、
getTerminalでの再開を確認します。 - アプリがその拡張を使うときだけインタープリターを試します(Python には
-pythonが必要です)。 - エラー処理が、利用不可、中断 / RPC、古いハンドル、ローカル待機タイムアウトを区別することを確認します。Errors and recovery を参照してください。
- シークレットがサンドボックスの env に保存されていないことを確認します。必要なときはアウトバウンドハンドラーを使います。
- 削除済み API(トランスポート、セッション、
execStream、startProcess、sandbox.terminal、gitCheckout、xterm のsessionId)を再度 grep します。
エージェント向けに Cloudflare Skills ↗ をインストールします(Agent setup)。sandbox-migrate-to-next スキルが、この移行を実行します。@next 上の新規アプリには sandbox-next を使います。現行の安定版パッケージでの日常作業には sandbox-stable を使います。安定版のまま非推奨 API を片付ける手順は、このガイドの前(または代わり)に 2026 deprecation guide(および sandbox-stable)にあります。