INTEGRITY Документация

Жизненный цикл песочницы

Песочница представляет собой изолированную среду выполнения, в которой запускается ваш код. Каждая песочница:

Состояния жизненного цикла

Создание

Песочница создаётся при первом обращении к её идентификатору:

const sandbox = getSandbox(env.Sandbox, "user-123");
await sandbox.exec('echo "Hello"'); // First request creates sandbox

Активно

Контейнер песочницы работает и обрабатывает запросы. Всё состояние остаётся доступным: файлы, запущенные процессы, сеансы оболочки и переменные окружения.

Простой

После периода бездействия (по умолчанию 10 минут, настраивается через sleepAfter), контейнер останавливается, чтобы освободить ресурсы. Когда приходит следующий запрос, запускается новый контейнер. Всё предыдущее состояние теряется, и среда возвращается в исходное состояние.

Примечание: Контейнеры с keepAlive: true никогда не переходят в состояние простоя: они автоматически отправляют heartbeat-пинги каждые 30 секунд, чтобы избежать вытеснения.

Уничтожение

Песочницы явно уничтожаются или автоматически очищаются:

await sandbox.destroy();
// All files, processes, and state deleted permanently

Время жизни и состояние контейнера

Состояние песочницы существует, только пока активен контейнер. Понимание этого крайне важно для создания надёжных приложений.

Пока контейнер активен (обычно от нескольких минут до нескольких часов активности):

Когда контейнер останавливается (из-за бездействия или явного удаления):

Следующий запрос создаёт новый контейнер с чистым окружением.

Стратегии именования

Sandbox для каждого пользователя

const sandbox = getSandbox(env.Sandbox, `user-${userId}`);

Используйте этот паттерн для интерактивных сред, плейграундов и блокнотов, где каждый пользователь возвращается в свою активную рабочую область.

Sandbox для каждой сессии

const sessionId = `session-${Date.now()}-${Math.random()}`;
const sandbox = getSandbox(env.Sandbox, sessionId);
// Later:
await sandbox.destroy();

Используйте этот паттерн для разового выполнения, CI/CD и тестов, которым нужна чистая среда.

Sandbox для каждой задачи

const sandbox = getSandbox(env.Sandbox, `build-${repoName}-${commit}`);

Идемпотентные операции с чётким сопоставлением задач и sandbox. Подходит для сборок, конвейеров и фоновых задач.

Маршрутизация запросов

Первый запрос к песочнице определяет её географическое расположение. Последующие запросы направляются в то же расположение.

Для глобальных приложений:

Управление жизненным циклом

Когда уничтожать

try {
	const sandbox = getSandbox(env.Sandbox, sessionId);
	await sandbox.exec("npm run build");
} finally {
	await sandbox.destroy(); // Clean up temporary sandboxes
}

Уничтожайте, когда: Сессия завершается, задача выполнена, ресурсы больше не нужны

Не уничтожайте: Персональные среды, долгоживущие сервисы

Управление контейнерами keepAlive

Контейнеры с keepAlive: true требуют явного управления, так как не завершаются по тайм-ауту автоматически:

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();

Обработка перезапусков контейнера

Контейнеры перезапускаются после бездействия или сбоев. Спроектируйте приложение так, чтобы оно корректно обрабатывало потерю состояния:

// 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");

Совместимость версий

SDK автоматически проверяет, что версия вашего пакета npm соответствует версии образа контейнера Docker. Несовпадение версий может привести к поломке функций или их непредсказуемому поведению.

Что происходит:

Когда вы можете увидеть предупреждения:

Как исправить: Обновите Dockerfile в соответствии с версией вашего npm-пакета. Например, если используется @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-python

См. Справочник по Dockerfile для получения сведений о вариантах образов и расширении базового образа.

Рекомендации