Контейнеры для функций и полноценных приложений

Каждая функция Inquir работает в изолированном Docker-контейнере, а не в V8 edge-изоляте, поэтому нативные модули и настоящие окружения Node.js 22, Python 3.12 и Go 1.22 просто работают. Если процесс должен работать постоянно, разверните его как контейнерное приложение из любого Dockerfile или образа — с релизами, откатом, томами, шаблонами Postgres и Redis и приватной сетью. Кластер не нужен ни в одном из случаев.

Обновлено: 2026-10-26

  • Контейнерная изоляция на функцию — зависимости разных функций никогда не конфликтуют
  • Нативные модули из inquir.yaml: sharp, bcrypt, numpy, pandas, cgo — без ограничений изолятов
  • Node.js 22, Python 3.12 и Go 1.22 за одним шлюзом и пайплайном
  • Контейнерные приложения для постоянных сервисов: любой Dockerfile или образ, релизы, откат, приватная сеть

Почему edge-изолятов не хватает для тяжёлых нагрузок

V8-изоляты быстрые и распределены по всему миру — идеальны для крошечной логики на edge. Но они запрещают нативные аддоны, ограничивают доступ к файловой системе, урезают память и закрывают доступ к приватным сетям. Sharp для ресайза изображений, bcrypt для хеширования паролей, numpy для обработки данных и любая Python-библиотека с C-расширениями требуют настоящей среды выполнения.

Функции на настоящих контейнерах закрывают этот разрыв: вы по-прежнему разворачиваете код и получаете HTTP-эндпоинты без кластера, но исполняется он в полноценной среде уровня ОС, а не в песочнице JavaScript-движка.

Почему VM и Kubernetes слишком тяжелы для большинства команд

VM или Kubernetes Deployment под каждую функцию означает, что обновления ОС, политики масштабирования, сертификаты ingress и постепенные развёртывания — ваши ещё до первой строчки бизнес-логики.

Управляемые сервисы контейнеров вроде ECS или Cloud Run помогают, но в каждом всё равно нужно связывать балансировщики, проверки работоспособности и task definitions — больше церемоний, чем нужно большинству бэкендов.

Изоляция контейнеров без эксплуатации кластера

Каждая функция работает в собственном изолированном контейнере. Нативные модули, объявленные в inquir.yaml, работают потому, что среда выполнения — настоящее контейнерное окружение, а не прослойка над изолятом. Тяжёлые Python-библиотеки, нативные аддоны Node.js и CGO-пакеты Go запускаются как положено.

Одна и та же граница контейнера обслуживает HTTP-вызовы через шлюз, шаги пайплайнов, в том числе по расписанию, и фоновые задачи.

Сервисы, которые должны работать постоянно, — веб-приложения, API с WebSocket, базы данных — запускаются как контейнерные приложения: соберите Dockerfile на платформе или выпустите релиз из готового образа, закрепите релизы по digest за проверкой работоспособности, откатывайтесь, подключайте тома и обращайтесь к другим приложениям по приватной сети. Подробности — в документации по приложениям.

Что дают контейнеры

Нативные модули из inquir.yaml

Объявите sharp, bcrypt, canvas, grpc, numpy, pandas или любую библиотеку с C-расширениями в build.dependencies в inquir.yaml. Работает корректно, потому что среда выполнения — настоящий контейнер, а не V8-изолят.

Полная стандартная библиотека

fs, child_process и crypto в Node.js; subprocess, os и ctypes в Python; os/exec и CGO в Go — полная среда выполнения языка, а не подмножество edge-изолята. Функции остаются в песочнице: сеть по умолчанию выключена, системные пакеты не ставятся.

Тёплые контейнеры для постоянного трафика

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

Несколько языков за одним шлюзом

Смешивайте функции на Node.js, Python и Go за одним API-шлюзом, одной моделью секретов и одной историей выполнения — без отдельной инфраструктуры под каждый язык.

Контейнерные приложения для постоянных сервисов

Любой Dockerfile или образ запускается как приложение: релизы, закреплённые по digest, переключение после проверки работоспособности, откат, тома, шаблоны Postgres и Redis и приватный адрес .apps.internal — в том же рабочем пространстве, что и функции.

Как работают функции на контейнерах в Inquir

1

Выбрать среду выполнения

Node.js 22, Python 3.12 или Go 1.22. Объявите зависимости в package.json, requirements.txt или go.mod — функции Dockerfile не нужен.

2

Объявить нативные зависимости в inquir.yaml

Языковые пакеты перечислите в build.dependencies, библиотеки ОС — в build.system. Деплой установит их в образ функции.

3

Подключить маршруты шлюза и шаги пайплайна

Привяжите функцию к HTTP-маршруту или шагу пайплайна. Для регулярных запусков добавьте расписание пайплайну — один и тот же контейнер обрабатывает все вызовы.

Пример нативного модуля: обработка изображений через sharp

Sharp использует нативные C++-биндинги: в контейнерах Inquir работает, в большинстве edge-изолятов падает. Функция получает байты изображения через тело HTTP-запроса или payload пайплайна.

images/thumbnail.mjs
import sharp from 'sharp';

export async function handler(event) {
  // Body is base64 for binary payloads routed through the gateway
  const input = Buffer.from(event.body ?? '', 'base64');
  const thumbnail = await sharp(input)
    .resize(320, 240)
    .jpeg({ quality: 82 })
    .toBuffer();
  return {
    statusCode: 200,
    headers: { 'Content-Type': 'image/jpeg' },
    body: thumbnail.toString('base64'),
    isBase64Encoded: true,
  };
}

Когда нужны контейнеры

Когда это уместно

  • Функции нужны нативные модули, дочерние процессы или исходящие вызовы к базам и API, которые запрещают edge-изоляты.
  • Нужны Node.js, Python и Go за одним шлюзом, без отдельного вендора под каждый язык.
  • Рядом с функциями нужен постоянно работающий сервис — разверните его как контейнерное приложение из Dockerfile или образа.

Когда лучше выбрать другое

  • Функция крошечная, на чистом JavaScript и должна работать в сотнях edge-точек ради глобальной задержки — для этого лучше V8-изоляты.

Частые вопросы

Нужно ли писать Dockerfile?

Для функции — нет: объявите зависимости в package.json, requirements.txt или go.mod, и платформа соберёт контейнер из управляемого базового образа для выбранной среды выполнения; нативные модули и пакеты ОС объявляются в inquir.yaml. Для контейнерного приложения вы приносите Dockerfile или образ, а платформа собирает его и выпускает релиз.

Чем контейнеры отличаются от Cloudflare Workers?

Workers работают в V8-изолятах, оптимизированных под задержку на edge; контейнеры Inquir запускают полноценные образы Node/Python/Go, оптимизированные под нативные модули, тяжёлые зависимости и обычные исходящие вызовы с сервера. Используйте Workers на edge для кеширования и fan-out, а контейнеры Inquir — для логики на origin.

Холодный старт медленнее, чем у edge-изолятов?

Да, холодный старт контейнера медленнее, чем у V8-изолята. Используйте тёплые контейнеры (тёплые пулы), чтобы прогревать функции, которым нужна стабильно низкая задержка. Замерьте p95/p99 на реалистичном трафике, прежде чем соглашаться на модель «только холодный старт».

Можно ли использовать ML-библиотеки Python вроде numpy и pandas?

Да. Контейнеры Python 3.12 поддерживают всю экосистему PyPI, включая numpy, pandas, scikit-learn и другие библиотеки с C-расширениями, — ставьте их через pip как любую другую зависимость.