← Sandbox SDK / sandbox / concepts
Životní cyklus sandboxu
Sandbox je izolované prostředí pro spouštění kódu. Každý sandbox:
- Má jedinečný identifikátor (ID sandboxu)
- Obsahuje izolovaný systém souborů
- Běží ve vyhrazeném Linux kontejneru
- Udržuje stav, dokud je kontejner aktivní
- Existuje jako Cloudflare Durable Object
Stavy životního cyklu
Vytvoření
Sandbox se vytvoří při prvním odkazu na jeho ID:
const sandbox = getSandbox(env.Sandbox, "user-123");
await sandbox.exec('echo "Hello"'); // First request creates sandboxAktivní
Kontejner sandboxu běží a zpracovává požadavky. Veškerý stav zůstává dostupný: soubory, běžící procesy, relace shellu i proměnné prostředí.
Nečinné
Po období nečinnosti (výchozí hodnota 10 minut, lze nastavit pomocí sleepAfter), kontejner se zastaví, aby uvolnil prostředky. Jakmile přijde další požadavek, spustí se nový kontejner. Veškerý předchozí stav se ztratí a prostředí se vrátí do počátečního stavu.
Poznámka: Kontejnery s keepAlive: true nikdy nepřejdou do nečinného stavu. Automaticky odesílají heartbeat pingy každých 30 sekund, aby se zabránilo odstranění.
Zničení
Sandboxy jsou buď explicitně zničeny, nebo automaticky vyčištěny:
await sandbox.destroy();
// All files, processes, and state deleted permanentlyŽivotnost a stav kontejneru
Stav sandboxu existuje pouze po dobu, kdy je kontejner aktivní. Pochopení tohoto principu je klíčové pro vytváření spolehlivých aplikací.
Dokud je kontejner aktivní (obvykle minuty až hodiny aktivity):
- Soubory zapsané do
/workspace,/tmp,/homezůstávají k dispozici - Procesy na pozadí běží dál
- Relace shellu si zachovávají svůj pracovní adresář a prostředí
- Kontexty nástroje Code interpreter uchovávají proměnné a importy
Když se kontejner zastaví (kvůli nečinnosti nebo explicitnímu zrušení):
- Všechny soubory se odstraní
- Všechny procesy se ukončí
- Veškerý stav shellu se resetuje
- Všechny kontexty interpretu kódu se vymažou
Další požadavek vytvoří nový kontejner s čistým prostředím.
Strategie pojmenování
Sandboxy pro jednotlivé uživatele
const sandbox = getSandbox(env.Sandbox, `user-${userId}`);Tento vzor použijte pro interaktivní prostředí, playgroundy a notebooky, kde se každý uživatel vrací do svého vlastního aktivního pracovního prostoru.
Sandboxy pro jednotlivé relace
const sessionId = `session-${Date.now()}-${Math.random()}`;
const sandbox = getSandbox(env.Sandbox, sessionId);
// Later:
await sandbox.destroy();Tento vzor použijte pro jednorázové spuštění, CI/CD a testy, které potřebují čisté prostředí.
Sandboxy pro jednotlivé úlohy
const sandbox = getSandbox(env.Sandbox, `build-${repoName}-${commit}`);Idempotentní operace s jasným mapováním úloh na sandboxy. Vhodné pro buildy, pipeline a úlohy na pozadí.
Směrování požadavků
První požadavek na sandbox určuje jeho geografickou polohu. Další požadavky se směrují do stejné lokality.
Pro globální aplikace:
- Možnost 1: Více sandboxů na uživatele s příponou regionu (
user-123-us,user-123-eu) - Možnost 2: Jeden sandbox na uživatele (jednodušší, ale někteří uživatelé zaznamenají vyšší latenci)
Správa životního cyklu
Kdy zničit
try {
const sandbox = getSandbox(env.Sandbox, sessionId);
await sandbox.exec("npm run build");
} finally {
await sandbox.destroy(); // Clean up temporary sandboxes
}Zničit když: Relace končí, úkol je dokončen, zdroje již nejsou potřeba
Neničit: Osobní prostředí, dlouhodobě běžící služby
Správa kontejnerů keepAlive
Kontejnery s keepAlive: true vyžadují explicitní správu, protože jim automaticky nevyprší platnost:
const sandbox = getSandbox(env.Sandbox, 'persistent-task', {
keepAlive: true
});
// Later, when done with long-running work
await sandbox.setKeepAlive(false); // Allow normal timeout behavior
// Or explicitly destroy:
await sandbox.destroy();Zpracování restartů kontejneru
Kontejnery se po nečinnosti nebo selhání restartují. Navrhněte aplikaci tak, aby zvládla ztrátu stavu:
// Check if required files exist before using them
const files = await sandbox.listFiles("/workspace");
if (!files.includes("data.json")) {
// Reinitialize: container restarted and lost previous state
await sandbox.writeFile("/workspace/data.json", initialData);
}
await sandbox.exec("python process.py");Kompatibilita verzí
SDK automaticky kontroluje, zda verze vašeho npm balíčku odpovídá verzi image Docker kontejneru. Nesoulad verzí může způsobit, že funkce přestanou fungovat nebo se budou chovat neočekávaně.
Co se stane:
- Při spuštění sandboxu SDK dotazuje verzi kontejneru
- Pokud se verze neshodují, zaznamená se varování
- Některé funkce nemusí fungovat správně, pokud jsou verze nekompatibilní
Kdy se mohou zobrazit varování:
- Aktualizovali jste balíček npm (
npm install @cloudflare/sandbox@latest) ale zapomněli jste aktualizovatFROMřádek ve vašem Dockerfile
Jak to opravit:
Aktualizujte svůj Dockerfile tak, aby odpovídal verzi vašeho npm balíčku. Pokud například používáte @cloudflare/[email protected]:
# Default image (JavaScript/TypeScript)
FROM docker.io/cloudflare/sandbox:0.7.0
# Or Python image if you need Python support
FROM docker.io/cloudflare/sandbox:0.7.0-pythonViz Referenční dokumentace Dockerfile pro podrobnosti o variantách image a rozšiřování základního image.
Osvědčené postupy
- Pojmenovávejte konzistentně - Používejte jasná a předvídatelná schémata pojmenování
- Vyčistěte dočasné sandboxy - Po dokončení vždy zrušte
- Opětovné využití uživatelských pracovních prostorů - Jeden dlouhodobě běžící sandbox na uživatele je často dostačující
- Dávkové operace - Kombinujte příkazy:
npm install && npm test && npm build - Navrhujte s ohledem na dočasný stav - Containers se po nečinnosti restartují a ztratí veškerý stav
Související zdroje
- Architektura - Jak sandboxy zapadají do systému
- Runtime kontejneru - Co běží uvnitř sandboxů
- Správa relací - Pokročilá izolace stavu
- API životního cyklu - Vytváření a správa sandboxů
- Sessions API - Vytváření a správa spouštěcích relací