node:alpine

Тема дорожной карты · Node.js

Docker-образ node:alpine — это минимальный образ Node.js, построенный на Alpine Linux, который обычно в 5–10 раз меньше стандартных образов node на основе Debian и широко используется в продакшн-развёртываниях контейнеров Node.js. Alpine Linux использует musl libc вместо glibc, что означает: некоторые npm-пакеты, включающие нативно скомпилированные аддоны (такие как sharp или ряд драйверов баз данных), могут потребовать дополнительных флагов компиляции или альтернативного образа node:slim. Использование node:alpine в качестве финального этапа многоэтапного Dockerfile является распространённой стратегией оптимизации производительности в серверной разработке Node.js: меньшие образы означают более быстрое время загрузки в CI/CD, меньшие затраты на хранение в реестре и уменьшенную поверхность атаки. При сборке приложений Node.js с TypeScript node:alpine сочетается с полноценным этапом сборки node, выполняющим компилятор TypeScript, тогда как alpine-этап получает только скомпилированный JavaScript.

Как это работает

node:alpine оборачивает Node-приложение в контейнер для воспроизводимых деплоев. Выбор базового образа важен: node:22-alpine (маленький, musl libc, иногда проблемы с нативными модулями), node:22-slim (на debian, лучше совместимость), node:22-bookworm (полный debian, самый большой). Multi-stage сборки компилируют + чистят: builder ставит deps и npm run build; runner копирует только dist/ + production-node_modules. Запускайте под non-root (USER node). Добавьте healthcheck.

Когда применять

Контейнеризуйте каждое production Node-приложение — воспроизводимость + deployment-пайплайн перевешивают цену. Slim или alpine для размера; bookworm — если упрётесь в native-модули. Всегда multi-stage. Кешируйте npm ci/pnpm install, копируя package*.json первым. Не ставьте dev-deps в runner. NODE_ENV=production. node (не npm start) как PID 1 — сигналы тогда работают.

Типичные ошибки

Ловушки node:alpine: копирование node_modules с хоста (несовпадение архитектуры, native-модули не пересобраны); npm install вместо npm ci (дрейф lockfile); проигнорированный .dockerignore (огромный build context); npm start как CMD (PID 1 — это npm, SIGTERM не доходит до Node); build-deps в runner-образе (раздутие + поверхность атаки). Один node Dockerfile даст 80% — копируйте его вперёд.

Связанные понятия

Полезные ресурсы