Dockerfile для Node.js
Тема дорожной карты · Node.js
Dockerfile для приложения Node.js определяет шаги для упаковки JavaScript-среды выполнения, исходного кода приложения и зависимостей в воспроизводимый образ контейнера, подходящий для серверной разработки и продакшн-развёртывания. Production-grade Dockerfile для Node.js обычно начинается с официального базового образа node:20-alpine, устанавливает непривилегированного USER для безопасности, сначала копирует package.json и package-lock.json для использования кэша слоёв Docker, затем выполняет npm ci --omit=dev для установки только продакшн-зависимостей и после этого копирует исходный код приложения. При работе с TypeScript Dockerfile должен включать шаг сборки, выполняющий npx tsc или пользовательский скрипт npm run build перед финальным этапом образа, а файл .dockerignore должен исключать node_modules, .env и src/ из продакшн-слоя. Лучшие практики Dockerfile для Node.js также включают установку NODE_ENV=production, определение инструкции HEALTHCHECK и использование CMD ["node", "dist/index.js"] вместо npm start, чтобы избежать лишнего процесса npm в контейнере.
Как это работает
Dockerfile для Node.js оборачивает 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 — сигналы тогда работают.
Типичные ошибки
Ловушки Dockerfile для Node.js: копирование 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% — копируйте его вперёд.