Какие особенности разработки бэка для контейнеров по сравнению с обычными Linux машинами
Что проверяют
Для фронтенд-разработчика это вопрос про Node.js-сервер: SSR на Next.js, BFF или API на Express, упакованные в контейнер. Проверяют, понимаете ли вы, что контейнер это изолированный процесс, а не маленький сервер, куда заходят по SSH. Следом обычно спрашивают про graceful shutdown и конфигурацию под разные окружения.
Как отвечать
Отличия удобно разложить по тому, что на обычной машине давала ОС, а в контейнере приходится делать самому:
- конфигурация: только переменные окружения, один образ едет на stage и прод. Подвох фронтенда:
NEXT_PUBLIC_*в Next.js иimport.meta.envв Vite вшиваются в бандл при сборке, и для одного образа на все окружения нужна конфигурация во время выполнения; - файловая система: временная, при пересоздании контейнера всё пропадает. Загрузки уходят в объектное хранилище, сессии в Redis, логи в stdout;
- сигналы: при остановке приходит
SIGTERM, через 10 секунд в Docker (30 в Kubernetes)SIGKILL. Node с PID 1 без своего обработчика на сигнал не реагирует, поэтому пишутCMD ["node", "server.js"]в exec-форме или запускают с--init, а в коде ловят сигнал, перестают принимать запросы и закрывают пулы; - сеть: сервер слушает
0.0.0.0, а не127.0.0.1. Соседние сервисы находятся по имени через DNS сети Docker, а не поlocalhost; - ресурсы: лимиты задаёт cgroup, а
os.cpus().lengthпоказывает ядра хоста, и кластер Node плодит лишних воркеров. Кучу ограничивают через--max-old-space-sizeпод лимит памяти; - образ: multi-stage сборка,
npm ci, пользовательnodeвместо root, для Next.jsoutput: 'standalone'; - здоровье: отдельные эндпоинты liveness и readiness, по ним оркестратор перезапускает контейнер и снимает трафик.
Где спотыкаются
Слушают 127.0.0.1 и долго ищут, почему сервис не отвечает соседнему контейнеру.
Запускают через npm start или shell-форму CMD. Между Docker и Node появляется лишний процесс, SIGTERM до приложения не доходит, контейнер добивают по таймауту, и запросы рвутся на каждом деплое.
Пишут данные в файловую систему контейнера или вшивают адрес API в бандл, а потом выясняется, что образ со stage нельзя выкатить на прод.