• システム開発に関わる内容をざっくりと書いていく

Docker コンテナが即終了するときの見方

docker run した瞬間に Exited になる、Compose で上がったと思ったらすぐ落ちる——「起動失敗」ではなく「プロセスがすぐ終わった」ことが多い。コンテナは PID 1 が終了すると止まる、という前提でログと終了コードを見る。

先に結論

  • まず docker logsdocker inspect の ExitCode/Error を見る
  • エントリポイント/CMD がワンショット(シェルが即終了)になっていないか確認
  • 依存サービス未起動、設定不足、権限、アーキテクチャ不一致も定番
  • 「動いているように見せる」ために sleep ループで誤魔化さない。原因をログで特定する

見る順番

  • docker ps -a で STATUS と終了コードを確認
  • docker logs <container> で起動直後の例外・missing file を確認
  • docker inspect で Args、Env、Mounts、RestartPolicy を確認
  • イメージの ENTRYPOINT/CMD が意図した常駐プロセスか
  • Compose なら depends_on だけではアプリ準備完了を待たない点に注意

よくある原因

  • 設定ファイル/環境変数不足でアプリが即終了
  • DB 未起動で接続失敗→プロセス終了(リトライ無し)
  • 実行ビット無し、shebang 不正、CRLF でスクリプト即死
  • amd64/arm64 の取り違え
  • ボリュームの権限で書き込み失敗

応急と本対応

  • 応急: 一時的に docker run -it --entrypoint sh で中に入り、手動起動して再現
  • 本対応: 起動コマンド修正、ヘルスチェック、依存の待機、設定の必須チェック
  • RestartPolicy で無限再起動しているなら、ログが流れて原因が見えやすい

ざっくりまとめ

  • 即終了=PID 1 が終わった。ログと ExitCode が一次情報
  • CMD/設定/依存/権限/CPU アーキを順に疑う
  • shell で中に入って手動起動すると原因が速い

関連記事