ビルドパイプライン
ビルドは Lizard のビルドノード上で実行されます:ローカルに Docker は不要です。デプロイすると、プラットフォームは固定の判定順序に従って、ソースをどのようにコンテナイメージへ変換するかを決定し、その後そのイメージを分離された pod で実行します。すべての container as a service がイメージをビルドしてくれるわけではありません。このブログでは、このカテゴリにある 3 つの形態を比較しています。
ビルドの判定順序
プラットフォームは次の順序で、ビルド戦略をちょうど 1 つ選びます:
dockerfilePathのリポジトリ Dockerfile:サービスにdockerfilePathが設定されている場合、ビルドコマンドや開始コマンドが設定されていても、その Dockerfile が変更されずに使用されます。startCommandが設定されていれば、実行時には Dockerfile のENTRYPOINTとCMDがそれに置き換えられます。Dockerfile でデプロイする を参照してください。- 合成された Dockerfile:それ以外で、サービスに
buildCommandおよび/またはstartCommandが設定されている場合(またはlizard up --build-command/--start-command経由で渡された場合)、Lizard はそれらのコマンドから Dockerfile を生成します。lizardpack は呼び出されません。 - ソース内の Dockerfile:それ以外の場合、ビルドディレクトリのルートにある
Dockerfileが使用されます(後述の GitHub の例外を参照)。 - lizardpack 自動検出:それ以外の場合、プラットフォームはビルドパック / Dockerfile ジェネレーターである lizardpack を実行します。
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)。検出はプロジェクトファイルと依存関係を調べます。複数のプロバイダーに一致する場合は、この順序で選びます。Node.js や Python のバージョンを固定するには、ランタイムバージョン を参照してください。
この経路では:
- アップロードされたソース(
lizard up)では、ルートのDockerfileが常に書かれたとおりに使用されます。 - GitHub ソースでは、ルートの
Dockerfileは不完全に見えない限り、書かれたとおりに使用されます。不完全と見なされるのは、build、dist、out、.next、publicを末尾のスラッシュなしでCOPYしていて(COPY dist /usr/share/nginx/html)、npm、yarn、pnpm、bun、pip、pip3、bundle、cargo、go build、mvn、gradleで始まるRUN行がない場合です。その場合は lizardpack が代わりの Dockerfile を生成します。 - Dockerfile がない場合は、lizardpack が生成します。
- 開始コマンド は自動検出されます:
Procfileweb:の行(Python/Ruby)またはpackage.jsonscripts.start(Node)が自動的に検出されます。Django、Flask、FastAPI がそれぞれ必要とする正確な行については、Pythonアプリホスティング を参照してください。 - ポート は
EXPOSE、フレームワークのデフォルト、または明示的なPORT環境変数から推定されます。
注意: GitHub ソースでは、事前ビルド済みの出力をコピーし(
COPY dist /dest)、パッケージマネージャーのRUNステップがない Dockerfile は、不完全と見なされ、lizardpack によって再生成されます。実際のビルドステップを追加するか、dockerfilePathを設定してそのまま使用するよう強制してください。Dockerfile の変更が反映されない を参照してください。
何が再ビルドを引き起こすか
| アクション | Rebuilds? |
|---|---|
追跡対象ブランチへの git push | ✅ GitHub webhook 経由 |
lizard redeploy / lizard up | ✅ 明示的 |
VITE_* または NEXT_PUBLIC_* 変数の変更 | ✅ 稼働中のサービスを再ビルドします。値がいつビルドに渡されるかは ビルド時の変数 を参照してください |
ビルドフィールド(repoUrl、branch、sourceType、buildCommand、dockerfilePath、rootDirectory)の service set | ✅ 稼働中のサービスは自動的に再ビルド。それ以外は lizard redeploy を実行 |
ランタイム専用フィールド(startCommand、preDeployCommand、containerPort、watchPatterns)の service set | ❌ 適用するには lizard redeploy を実行 |
| その他の環境変数 / シークレットの変更 | ❌ クイック再起動で適用(再ビルドなし) |
二重にビルドしないでください。 稼働中のサービスでビルドフィールドを変更する
service setの後は、再ビルドが自動で始まります:その後にlizard redeployを続けないでください。そのビルドがキャンセルされ、最初からやり直しになります (理由)。クラッシュしたサービスや一度もデプロイされていないサービスは、自動では再ビルドされません。lizard redeployを実行してください。
ビルド時の変数
Lizard は次の 2 つの場合に、VITE_* と NEXT_PUBLIC_* 変数を ENV 行として Dockerfile に書き込みます:
dockerfilePathのない GitHub サービス: lizardpack の Dockerfile、またはリポジトリのルートのDockerfileに書き込まれます。buildCommandまたはstartCommandがあり、合成された Dockerfile が Node のビルドであるサービス。
ビルドコマンドも開始コマンドもなしに lizard up でデプロイしたサービスには、ビルド時に Lizard の変数は渡されません。COMMIT_SHA 以外のビルド引数はどのサービスにも渡されないため、Dockerfile 内の ARG は空のままになります。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 を読み、原因を修正し(リポジトリ内、または lizard service set 経由で buildCommand / startCommand を調整して)、その後 lizard redeploy を実行してください。
ランタイムに関する注意
- Docker の
HEALTHCHECKはありません。 ランタイムは Docker の healthcheck ループを実行しないため、HEALTHCHECKディレクティブは無視されます。代わりに Lizard はポートに対して TCP プローブを実行します(worker mode ではスキップされます)。 - 求められていないのに Dockerfile を書かないでください。 lizardpack はほとんどのスタックを自動検出します:まずデプロイを試し、自動ビルドが合わない場合にのみ Dockerfile を追加する(または
dockerfilePathを設定する)ようにしてください。
ビルド設定リファレンス
| フィールド | 説明 |
|---|---|
buildCommand | アプリをビルドするコマンド → dockerfilePath が設定されていない限り、合成された Dockerfile 経路を選択 |
startCommand | ランタイムでアプリを起動するコマンド。イメージの ENTRYPOINT と CMD を置き換えます |
preDeployCommand | すべてのコンテナの起動時(レプリカごと、再起動ごと)に、startCommand の前に実行されます。startCommand が設定されている場合のみ実行されます。何度実行しても、同時に実行しても安全なようにしてください |
dockerfilePath | そのまま使用する、リポジトリ内 Dockerfile へのパス。イメージのビルドでは buildCommand / startCommand より優先されます |
rootDirectory | ビルド元のサブディレクトリ(モノレポ) |
watchPatterns | 一致するパスが変更された場合のみ再デプロイ |
containerPort | アプリが listen する TCP ポート(デフォルト 3000; 0 = worker) |
これらはいずれも lizard service set <svc> --set <field>=<value> で設定できます。フィールドをクリアするには、--set buildCommand= のように空の値を指定します。lizard service を参照してください.
更新日