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

Среда выполнения контейнера

Каждый sandbox выполняется в изолированном контейнере Linux с предустановленными Python, Node.js и стандартными инструментами разработки. Полный список предустановленного ПО и способы настройки образа контейнера см. в Справочник по Dockerfile.

Установка программного обеспечения во время выполнения

Устанавливайте дополнительное программное обеспечение во время выполнения с помощью стандартных пакетных менеджеров:

# Python packages
pip install scikit-learn tensorflow

# Node.js packages
npm install express

# System packages (requires apt-get update first)
apt-get update && apt-get install -y redis-server

Файловая система

Контейнер предоставляет стандартную файловую систему Linux. Вы можете читать и записывать данные там, где у вас есть соответствующие права.

Стандартные директории:

Пример:

await sandbox.writeFile('/workspace/app.py', 'print("Hello")');
await sandbox.writeFile('/tmp/cache.json', '{}');
await sandbox.exec('ls -la /workspace');

Управление процессами

Процессы работают точно так же, как в обычной среде Linux.

Процессы переднего плана (exec()):

const result = await sandbox.exec('npm test');
// Waits for completion, returns output

Фоновые процессы (startProcess()):

const process = await sandbox.startProcess('node server.js');
// Returns immediately, process runs in background

Сетевые возможности

Исходящие подключения работают:

curl https://api.example.com/data
pip install requests
npm install express

Входящие подключения требуют открытия порта:

const { hostname } = new URL(request.url);
await sandbox.startProcess('python -m http.server 8000');
const exposed = await sandbox.exposePort(8000, { hostname });
console.log(exposed.url); // Public URL

Localhost работает внутри песочницы:

redis-server &      # Start server
redis-cli ping      # Connect locally

Безопасность

Между песочницами (изолированно):

Внутри sandbox (общий):

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

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

Ограничения

Нельзя: