Ответ вслух Middle Docker для разработчика спрашивают часто обновлено

Как написать хороший Dockerfile для Node

Вопрос

Как бы ты написал Dockerfile для Node.js-сервиса в прод? Что в нём важно?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Беру конкретный базовый образ, например node:22-alpine, чтобы сборки были воспроизводимыми. Делаю multi-stage: на стадии сборки копирую package.json и lock-файл, ставлю зависимости через npm ci и только потом копирую исходники и собираю.

Что должно прозвучать в ответе

  • Конкретный базовый образ (node:22-alpine или slim), не latest

  • Порядок слоёв: сначала манифесты и npm ci, потом исходники

  • Multi-stage: сборка отдельно, в финале только dist и прод-зависимости

  • .dockerignore: node_modules, .git, .env

  • USER node, не root

  • Exec-форма CMD, healthcheck, секреты не в образе

Что могут спросить следом

  • Почему образ получается на 1 ГБ и как его уменьшить?
  • Как передать секрет, нужный во время сборки?
  • Чем alpine может помешать?

Разбор

Беру конкретный базовый образ, например node:22-alpine, чтобы сборки были воспроизводимыми. Делаю multi-stage: на стадии сборки копирую package.json и lock-файл, ставлю зависимости через npm ci и только потом копирую исходники и собираю. Так кеш слоя с зависимостями живёт, пока они не поменялись.

В финальной стадии ставлю только прод-зависимости и копирую из сборки dist. Компиляторы и исходники в прод не попадают, образ маленький. В .dockerignore кладу node_modules, .git и .env, чтобы мусор и секреты не уехали в контекст.

Запускаю от пользователя node, а не root. CMD пишу массивом, чтобы Node был PID 1 и получал SIGTERM для корректного завершения. Добавляю healthcheck. Секреты в образ не кладу: ни в ENV, ни в ARG, они передаются при запуске.

Про alpine помню, что там musl вместо glibc, и некоторые нативные модули могут вести себя иначе; тогда беру slim.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.