Start Debugging

Podman + systemd で .NET アプリをデプロイする: 安定した再起動、本物のログ、魔法なし

Linux VM 上で Podman と systemd を使って .NET 9 と .NET 10 のサービスをデプロイします。安定した再起動、journald 経由の本物のログ、そして本物のサービスのように管理されるコンテナ化アプリ -- Kubernetes は不要です。

今日 r/dotnet で出てきた話題です: Kubernetes でも壊れやすい nohup スクリプトでもない、.NET サービス向けの「退屈なデプロイ」のやり方を、人々はいまだに探しています。Linux VM 上にいるなら、Podman と systemd の組み合わせは堅実な落としどころです: 本物のサービスのように管理される、コンテナ化されたアプリになります。

元の議論: https://www.reddit.com/r/dotnet/comments/1q8gq1u/how_to_deploy_net_applications_with_systemd_and/

.NET 9 と .NET 10 のサービスにこれがよく合う理由

コンテナをビルドして実行する

.NET 9 アプリ向けの最小限の Containerfile です (.NET 10 でも同じように動きます。ベースタグを切り替えるだけです):

FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
WORKDIR /app
EXPOSE 8080

FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /out

FROM base
WORKDIR /app
COPY --from=build /out .
ENV ASPNETCORE_URLS=http://+:8080
ENTRYPOINT ["dotnet", "MyApp.dll"]

それから:

podman build -t myapp:1 .
podman run -d --name myapp -p 8080:8080 myapp:1

systemd に持たせる (役に立つ部分)

Podman は systemd が理解できるユニットファイルを生成できます。注意: podman generate systemd は Podman 4.4+ で Quadlet に取って代わられて非推奨になりましたが、生成される出力は引き続き動作し、概念を明確に示してくれます:

podman generate systemd --new --name myapp --files

これで container-myapp.service のようなものができます。所定の場所に移します:

sudo mv container-myapp.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now container-myapp.service

これで運用コマンドがすっきりします:

sudo systemctl status container-myapp.service
sudo journalctl -u container-myapp.service -f
sudo systemctl restart container-myapp.service

後で自分を救う 2 つのディテール

設定を明示的にする

イメージにシークレットを焼き込むのではなく、環境変数とマウントした設定ディレクトリを使ってください。systemd ならドロップインファイルでオーバーライドを設定でき、安全に再起動できます。

現実に合った再起動ポリシーを選ぶ

設定不足ですぐに失敗するアプリの場合、無限の再起動はノイズにすぎません。マシンを叩きつけない再起動ポリシーを選んでください。systemd は遅延やバースト制限の制御を可能にします。

「これで合っているのか?」を判定する 1 つのテストが欲しい場合: VM を再起動して、SSH で入らなくても .NET サービスが立ち上がってくるかを見てください。それが基準線です。

参考リンク: https://docs.podman.io/

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る