Конвейер сборки
Сборки выполняются на узлах сборки Lizard — вам не нужен Docker локально. При развёртывании платформа по заданному порядку решает, как превратить ваш исходный код в образ контейнера, а затем запускает этот образ в изолированном поде. Не каждый контейнер как сервис собирает образ за вас; в блоге сравниваются три формы, в которых встречается эта категория.
Порядок выбора стратегии сборки
Платформа выбирает ровно одну стратегию сборки, в таком порядке:
- Dockerfile из репозитория по пути
dockerfilePath: если на сервисе заданdockerfilePath, этот Dockerfile используется без изменений, даже если заданы также команды сборки или запуска. ЗаданныйstartCommandпо-прежнему заменяетENTRYPOINTиCMDиз Dockerfile во время выполнения. См. Развёртывание с Dockerfile. - Синтезированный Dockerfile — иначе, если на сервисе заданы
buildCommandи/илиstartCommand(или переданы черезlizard up --build-command/--start-command), Lizard генерирует Dockerfile из этих команд. lizardpack не вызывается. - Dockerfile в исходном коде — иначе используется
Dockerfileв корне директории сборки (см. исключение для GitHub ниже). - Автоопределение lizardpack — иначе платформа запускает lizardpack, свой генератор Dockerfile / buildpack.
Автоопределение lizardpack
lizardpack анализирует ваш репозиторий и собирает оптимизированный многостадийный образ. Поддерживаемые стеки, проверяемые в таком порядке:
Hugo → Go → Node → Python → Rust → Ruby → PHP → Java → static
См. Руководства по фреймворкам для продакшн-скриптов, адаптеров, путей вывода и портов: Hugo, Go, Node (Node.js, Next.js, Nuxt, SvelteKit, Astro, React, Vue, Docusaurus, VitePress), Python (Django, FastAPI, Streamlit) и Ruby (Rails). lizardpack определяет стек по файлам проекта и зависимостям. Если подходят несколько провайдеров, он выбирает их в указанном порядке. Как закрепить версию Node.js или Python, см. в разделе версии runtime.
На этом пути:
- Загруженный исходный код (
lizard up) всегда использует корневойDockerfileкак есть. - Исходный код из GitHub использует корневой
Dockerfileкак есть, если он не выглядит неполным: в нём естьCOPYдляbuild,dist,out,.nextилиpublic, записанный без завершающего слеша (COPY dist /usr/share/nginx/html), и нет строкиRUN, начинающейся сnpm,yarn,pnpm,bun,pip,pip3,bundle,cargo,go build,mvnилиgradle. Тогда lizardpack генерирует замену. - Если Dockerfile нет, lizardpack генерирует его за вас.
- Команда запуска определяется автоматически: строка
Procfileweb:(Python/Ruby) илиpackage.jsonscripts.start(Node) подхватывается автоматически. Для точной строки, которую хотят Django, Flask и FastAPI, см. Хостинг Python-приложений. - Порт выводится из
EXPOSE, значений фреймворка по умолчанию или явной переменной окруженияPORT.
Подвох: Для исходного кода из GitHub Dockerfile, который копирует предварительно собранный результат (
COPY dist /dest) и не содержит шагаRUNс менеджером пакетов, считается неполным и регенерируется lizardpack. Добавьте реальный шаг сборки или задайтеdockerfilePathдля принудительного использования как есть. См. Изменения Dockerfile не применяются.
Что вызывает пересборку
| Действие | Пересобирает? |
|---|---|
git push в отслеживаемую ветку | ✅ через вебхук GitHub |
lizard redeploy / lizard up | ✅ явно |
Изменение переменных VITE_* или NEXT_PUBLIC_* | ✅ пересобирает запущенный сервис; о том, когда значения попадают в сборку, см. переменные времени сборки |
service set полей сборки (repoUrl, branch, sourceType, buildCommand, dockerfilePath, rootDirectory) | ✅ автопересборка запущенного сервиса; иначе запустите lizard redeploy |
service set полей только времени выполнения (startCommand, preDeployCommand, containerPort, watchPatterns) | ❌ запустите lizard redeploy для применения |
| Любое другое изменение переменной окружения / секрета | ❌ применяется при быстром перезапуске (без пересборки) |
Не дублируйте сборку. После
service set, меняющего поле сборки на запущенном сервисе, пересборка запускается автоматически. Не ставьте в цепочкуlizard redeployпосле этого, иначе поставите в очередь вторую избыточную сборку (почему). Упавший или ни разу не развёрнутый сервис сам не пересобирается; запуститеlizard redeploy.
Переменные времени сборки
Lizard записывает переменные VITE_* и NEXT_PUBLIC_* в Dockerfile в виде строк ENV в двух случаях:
- Сервисы из GitHub без
dockerfilePath: их получает Dockerfile от lizardpack или корневойDockerfileрепозитория. - Сервисы с
buildCommandилиstartCommand, для которых сгенерированный Dockerfile собирает Node.
Сервисы, развёрнутые через lizard up без команды сборки или запуска, не получают переменных Lizard во время сборки. Ни один сервис не получает аргументов сборки, кроме COMMIT_SHA, поэтому ARG в вашем Dockerfile остаётся пустым. Для публичных значений при lizard up закоммитьте их в .env.production (проверьте, что .gitignore его не исключает), впишите их в свой Dockerfile или, для серверного приложения на Node, задайте и buildCommand, и startCommand.
Наблюдение за сборкой
Логи сборки стримятся во время lizard up. Для любого сервиса:
lizard logs --build # the most recent build's logs
lizard events # deploy history + replica statusЕсли сборка упала, прочитайте lizard logs --build, устраните причину (в репозитории или скорректировав buildCommand / startCommand через lizard service set), затем lizard redeploy.
Примечания к рантайму
- Нет Docker
HEALTHCHECK. Рантайм не запускает цикл healthcheck Docker, поэтому директивыHEALTHCHECKигнорируются. Lizard выполняет TCP-пробирование вашего порта вместо этого (пропускается в режиме воркера). - Не пишите Dockerfile без нужды. lizardpack автоопределяет большинство стеков — попробуйте сначала задеплоить, и добавляйте Dockerfile (или задавайте
dockerfilePath) только если автосборка не подходит.
Справочник по конфигурации сборки
| Поле | Описание |
|---|---|
buildCommand | Команда сборки вашего приложения → выбирает путь синтезированного Dockerfile, если не задан dockerfilePath |
startCommand | Команда запуска приложения во время выполнения; заменяет ENTRYPOINT и CMD образа |
preDeployCommand | Выполняется в начале каждого контейнера (каждая реплика, каждый перезапуск) перед startCommand; выполняется, только если задан startCommand. Сделайте её безопасной для многократного и одновременного запуска |
dockerfilePath | Путь к Dockerfile в репозитории для использования как есть; при сборке образа имеет приоритет над buildCommand / startCommand |
rootDirectory | Поддиректория для сборки (монорепозитории) |
watchPatterns | Передеплой только при изменении соответствующих путей |
containerPort | TCP-порт, который слушает приложение (по умолчанию 3000; 0 = воркер) |
Любое из этих полей можно задать через lizard service set <svc> --set <field>=<value>. Очистить поле можно пустым значением, например --set buildCommand=. См. lizard service.
Обновлено