Как написать хороший Dockerfile для Node
Вопрос
Как бы ты написал Dockerfile для Node.js-сервиса в прод? Что в нём важно?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Конкретный базовый образ (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 ошибок.