← Sandbox SDK / sandbox / 1-0-preview
Начало работы
1. Установите пакет preview
В проекте Workers, который уже использует Sandbox, или в новом проекте на основе шаблона Sandbox:
npm i @cloudflare/sandbox@nextСоздание и развертывание Worker и образ контейнера sandbox из той же preview-линии.
2. Экспортируйте класс Sandbox
import { Sandbox } from "@cloudflare/sandbox";
export { Sandbox };import { Sandbox } from "@cloudflare/sandbox";
export { Sandbox };Храните свой wrangler привязку Durable Object и конфигурацию контейнера. Специфичные для preview транспортные переменные не требуются.
3. Запустите процесс
exec() запускает программу из argv : массив с путём или именем исполняемого файла, а затем его аргументами. Ожидает, пока песочница не сможет запустить процесс, затем возвращает дескриптор процесса. Оно делает не дождитесь завершения процесса.
Собирайте результаты с помощью методов handle, например output(), либо в потоковом режиме с помощью logs().
import { getSandbox, proxyToSandbox } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
export default {
async fetch(request, env) {
const proxy = await proxyToSandbox(request, env);
if (proxy) return proxy;
const sandbox = getSandbox(env.Sandbox, "preview-demo");
const process = await sandbox.exec(["python3", "-c", "print(2 + 2)"]);
const output = await process.output({ encoding: "utf8" });
return Response.json({
id: process.id,
pid: process.pid,
stdout: output.stdout,
exitCode: output.exitCode,
});
},
};import { getSandbox, proxyToSandbox } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
type Env = {
Sandbox: DurableObjectNamespace<import("@cloudflare/sandbox").Sandbox>;
};
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const proxy = await proxyToSandbox(request, env);
if (proxy) return proxy;
const sandbox = getSandbox(env.Sandbox, "preview-demo");
const process = await sandbox.exec(["python3", "-c", "print(2 + 2)"]);
const output = await process.output({ encoding: "utf8" });
return Response.json({
id: process.id,
pid: process.pid,
stdout: output.stdout,
exitCode: output.exitCode,
});
},
};Каждый элемент argv соответствует одному аргументу процесса. SDK не запускает оболочку и не не экранирует argv для shell. Пробелы и специальные символы в элементе остаются внутри этого аргумента.
Синтаксис shell (&&, конвейеры, перенаправления, глобы) требует явного вызова shell, где сам скрипт передаётся отдельным аргументом:
const process = await sandbox.exec([
"/bin/bash",
"-lc",
"echo hello && uname -a",
]);
const { stdout } = await process.output({ encoding: "utf8" });const process = await sandbox.exec([
"/bin/bash",
"-lc",
"echo hello && uname -a",
]);
const { stdout } = await process.output({ encoding: "utf8" });4. Чем это отличается от стабильного пакета
await sandbox.exec(...)создаёт процесс. Он не дождитесь завершения. Используйтеoutput(),waitForExit(), либо другие методы хендла для завершения.- Каждый
exec()работает независимо.cdилиexportв одном вызове не сохраняется в следующем. - Передайте
cwdиenvна каждыйexec()когда они вам нужны, либо используйтеsetEnvVarsдля значений на уровне всего сандбокса. См. Переменные окружения. - Процесс выполняется только в текущий контейнер для этого сандбокса. После остановки или замены контейнера запустите новый процесс. Модель: Жизненный цикл песочницы.
- Прежде чем запускать продакшен-трафик, выясните, какие сбои можно безопасно повторять: Ошибки и восстановление.
Далее
- Жизненный цикл песочницы : ID песочницы, контейнер, остановка и замена
- Выполнение процессов,
exec(), хендлы и продолжение работы между запросами - Ошибки и восстановление : повторные попытки, прерванные вызовы и неактуальные handle
- Миграция : обновление существующего стабильного приложения
- Справочник по API : процессы, терминалы и ошибки
- Терминалы : интерактивные PTY и подключения браузера
- Расширения