docker run した瞬間に Exited になる、Compose で上がったと思ったらすぐ落ちる——「起動失敗」ではなく「プロセスがすぐ終わった」ことが多い。コンテナは PID 1 が終了すると止まる、という前提でログと終了コードを見る。
先に結論
- まず
docker logs と docker 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 で中に入って手動起動すると原因が速い
関連記事