docker-compose

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

Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений из единого файла docker-compose.yml, идеально подходящий для сред разработки серверных приложений Node.js, которые зависят от таких сервисов, как база данных, кэш Redis или брокер сообщений. В типичной конфигурации Node.js Docker Compose файл docker-compose.yml описывает сервис node, собираемый из Dockerfile проекта, монтирует директорию с исходным кодом как том для горячей перезагрузки и связывает его с сервисами postgres или mongodb — всё это запускается вместе командой docker compose up. Переменные окружения для URL баз данных, process.env.PORT и другие секреты передаются через директиву environment или env_file, указывающую на файлы .env или .env.stage, что обеспечивает отделение конфигурации от кода приложения Node.js. Проверки работоспособности (health checks) Docker Compose гарантируют, что зависимые сервисы — например, база данных — будут готовы прежде, чем запустится контейнер серверного приложения Node.js, предотвращая ошибки подключения при старте. Использование Docker Compose в CI-конвейерах позволяет командам Node.js запускать интеграционные тесты против реальных сервисных контейнеров, а команда docker compose down --volumes очищает состояние между тестовыми прогонами.

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

docker-compose оборачивает 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 — сигналы тогда работают.

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

Ловушки docker-compose: копирование 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% — копируйте его вперёд.

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

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