nodbox
Разделы документации

Сборка без Dockerfile

Как платформа определяет язык, зависимости и команду запуска, и что делать, если сборка не прошла.

Платформа собирает приложение без Dockerfile: она читает файлы проекта, сама определяет язык, зависимости и команду запуска и превращает исходники в образ. Если сборка не прошла, версия получает причину отказа, а работающая версия продолжает отвечать.

Как платформа определяет язык

Язык определяется по файлам в корне сборки. Ничего настраивать не нужно: ни конфига, ни пометок в репозитории.

Файл в корне Что собирается
package.json приложение на Node.js
requirements.txt или pyproject.toml приложение на Python
go.mod приложение на Go
index.html статический сайт

Node.js, Python и Go проверены на реальных приложениях. Статический сайт из index.html тоже собирается. Другие языки платформа пробует определить сама, но на реальных приложениях они не проверены, поэтому здесь не обещаны. Если язык не определился, версия получает причину language_not_detected, и тогда помогает свой Dockerfile.

Версию рантайма и команду запуска платформа тоже выбирает по содержимому проекта. Если выбрано не то, команды и версии задаются вручную: это разобрано на странице Настройки сборки и свой Dockerfile.

Этапы деплоя

Деплой идёт по порядку: код, сборка, публикация образа, выкат. Панель показывает текущий этап словами из таблицы.

Этап Что происходит Как называется в панели
Код Платформа клонирует выбранную ветку или разбирает архив, проверяет файлы и сохраняет снимок исходников В очереди, Код загружается, Код получен
Сборка Платформа определяет язык и собирает образ Образ собирается
Публикация Готовый образ загружается в реестр платформы и подписывается Образ публикуется, Образ собран
Выкат Платформа запускает приложение из образа и ждёт, пока оно ответит на своём порту Деплоится
Готово Версия принимает запросы на адресе приложения Работает

Версия из готового образа проходит только выкат: собирать ей нечего. Так же выкатывается запуск после остановки, он берёт образ прежней работавшей версии. Откуда берётся код, разобрано на странице Источники кода.

Время, сеть, кэш и деньги

  • Время. На сборку отведено до 16 минут, на весь деплой от заказа версии до готовности - до 48. Сборка, которая не уложилась, останавливается с причиной build_timeout.
  • Очередь. Если мощностей для сборки сейчас не хватает, она ждёт своей очереди. Лог сборки в это время пуст: он открывается, когда сборка началась.
  • Песочница. Каждая сборка идёт в отдельной изолированной среде. Скрипты установки зависимостей и шаги Dockerfile исполняются там, а не на общей машине, и чужие сборки из неё не видны.
  • Сеть. Сборка выходит в интернет без ограничений по портам и протоколам: зависимости, git-пакеты и файлы из шагов сборки скачиваются как обычно. Внутренняя сеть платформы из неё закрыта.
  • Кэш. Кэша между сборками нет, каждая сборка начинается с чистого листа. Повторный деплой тех же исходников не быстрее первого. Исключение - публичные базовые образы: копия лежит рядом со сборкой, и скачиваются они быстро.
  • Деньги. Сборка не тарифицируется: плата начинается с подтверждённого выката. Упавшая сборка ничего не стоит.
  • Работающая версия. Пока собирается новая версия, прежняя отвечает на запросы. Упавшая сборка её не трогает: неудачная версия остаётся в истории с причиной, а работающая остаётся работающей.

На замерах платформы холодная сборка приложений на Node.js и Vite занимала от трёх до пяти минут. Тяжёлые деревья зависимостей идут дольше, поэтому потолок в 16 минут оставляет запас.

Временные сбои платформа переживает сама: недоступная сеть при скачивании рантайма или перегруженный реестр базовых образов не роняют деплой с первой попытки. Тогда в логе стоит строка «Причина временная: платформа повторит сборку».

Идущий деплой можно отменить, это описано на странице Версии и откат.

Dockerfile в корне

Если в корне сборки лежит файл с именем Dockerfile, платформа собирает образ по нему. Режим выбора называется auto, он включён по умолчанию. В логе сборки об этом стоит строка «В корне сборки найден Dockerfile - образ собирается по нему.»

Команды сборки и запуска и версии рантайма при этом не применяются: всё записано в самом Dockerfile. Собрать без него, даже если он лежит в репозитории, можно через настройки, они разобраны на странице Настройки сборки и свой Dockerfile.

Как понять, что язык определён не так

Первый признак стоит в логе сборки. Строка «План сборки составлен» называет распознанные языки и версии рантайма: сверь их с тем, что ты ожидал. Лог читается на странице Лог сборки.

Типичные случаи:

  • В корне нет файлов проекта. Так бывает в монорепозитории: приложение лежит в папке apps/web, а в корне только общий конфиг. Версия получает language_not_detected. Нужно указать корневую папку приложения в настройках сборки.
  • В корне лежит Dockerfile для локальной разработки. Платформа собирает по нему, хотя ты рассчитывал на автоопределение. Строка про найденный Dockerfile в логе подскажет это сразу.
  • Сборка прошла, но приложение не запустилось. Скорее всего, команда запуска определена не та или приложение слушает не тот порт. Версия получает container_exited или port_unreachable, и объяснение лежит в логе приложения.
  • Сборке нужна переменная. Переменные и секреты приложения сборке не видны, у сборки свои. Они задаются в настройках сборки.

Причины отказа версии

Если версия не выкатилась, в ней записана причина, а панель называет её словами. Кнопка в сообщении о провале открывает нужный лог: лог сборки, если версия упала до выката, и лог приложения, если после.

Причины сборки объясняет последняя строка лога сборки:

Причина Что случилось Что делать
language_not_detected в корне сборки нет знакомых файлов: package.json, requirements.txt, go.mod и других положить проект в корень, указать корневую папку или добавить Dockerfile
build_failed шаг сборки завершился ошибкой: не встали зависимости, не прошла команда сборки, не нашлась команда запуска прочитать строки лога выше и проверить, что проект собирается локально
build_timeout сборка не уложилась в 16 минут и остановлена найти в логе шаг, на котором сборка замолчала
dockerfile_missing выбрана сборка по Dockerfile, а файла в корне сборки нет положить файл или вернуть автоматический выбор сборщика
root_directory_missing корневой папки в исходниках версии нет проверить путь в настройках сборки
image_too_large собранный образ больше допустимого размера убрать из образа лишнее, например то, что нужно только при разработке
limit_exceeded исходники не помещаются в отведённое место уменьшить проект, размеры названы в разделе Лимиты и квоты
source_unavailable до кода не добраться: подключение отозвано, репозиторий или ветка не найдены проверить подключение и ветку
archive_invalid, archive_encrypted, compression_unsupported архив не разобрался собрать архив заново, правила описаны в разделе «Проверка архива» страницы Источники кода

Две причины говорят о сбое на стороне платформы, а не о твоём коде:

Причина Что случилось Что делать
push_failed образ собран, но не лёг в реестр заказать деплой ещё раз
internal внутренний сбой платформы заказать деплой ещё раз

Три причины относятся к выкату, и сборка к этому времени уже закончилась, поэтому лог сборки их не объясняет:

Причина Что случилось Что делать
container_exited процесс приложения запускался раз за разом и каждый раз завершался прочитать логи приложения
out_of_memory приложению не хватило памяти его размера, и процесс остановлен выбрать размер побольше, см. Размеры приложения
port_unreachable процесс запустился и не ответил на своём порту проверить порт, см. Порт, протокол и проверка готовности

Письмо о провале деплоя приходит само, если оно включено в проекте: оно цитирует последние строки лога сборки либо отсылает к логу приложения. Настройка описана на странице Уведомления.

Что дальше


Страница в markdown, так её читает агент: /docs/deploy/build.md