メインコンテンツまでスキップ

第53章:終了コードと再起動ループの読み方🔁😵

この章を終えると、こうなるよ👇

  • 「Exited (1)」「Exited (137)」みたいな表示を見て、だいたいの“落ち方”を推測できる🕵️‍♂️✨
  • 再起動ループ(落ちる→起きる→落ちる…)を落ち着いて止めて、原因に近づける🧯✅
  • docker inspect で「ExitCode / OOMKilled / RestartCount」を拾って、ログとつなげて判断できる🔎🪵

1) まず結論:終了コードは「コンテナの死因メモ」🧾💀

コンテナは中で動いてる“メインのプロセス”(だいたいPID 1)が終わると止まるよ。 そのときの終了コード(exit code)が Exited (xxx)(xxx) になる。

そして重要ポイント👇

  • 0:正常終了🎉(でも「サービスとしては困る」こともある)
  • 0以外:何かしら失敗💥(設定ミス・依存不足・例外・メモリ不足…)
  • 128 + N:シグナル(強制終了など)っぽい合図(例:137=SIGKILL、143=SIGTERM)⚡
  • 再起動ループは「落ちる原因」が残ったまま、再起動設定で延々リトライしてる状態🔁😵

2) よく出る終了コード早見表📚⚡(これだけ覚えると強い)

表示だいたいの意味ありがちな原因
Exited (0)正常終了🎉サーバ起動じゃなくて「1回実行して終わるコマンド」を走らせてる(例:npm test
Exited (1)雑に言うと「失敗」💥例外・env不足・設定ミス・DB接続失敗でアプリが落ちた
Exited (2)引数の使い方ミス系が多い🧩コマンドのオプションが変 / 期待形式と違う
Exited (125)Docker側が起動できなかった🚫docker run 自体が失敗(オプション/権限/指定ミス)
Exited (126)コマンドはあるが実行できない🔒権限不足、実行ビットなし等
Exited (127)コマンドが見つからないnode/npm/sh が無い、PATHが違う等
Exited (137)SIGKILL(強制終了)⚡OOM(メモリ不足)で落ちることが多いがそれだけじゃない (Stack Overflow)
Exited (139)SIGSEGV(セグフォ)💥ネイティブ拡張やバイナリ絡みでクラッシュ (Stack Overflow)
Exited (143)SIGTERM(停止要求)🧑‍✈️docker stop などで止められた系 (Stack Overflow)

137/143あたりは「シグナルだから 128+番号」系だよ、という認識でOK👌 (Stack Overflow)


3) 再起動ループの正体:restart policy が効いてるだけ🔁🧠

Dockerには「落ちたら再起動する」設定があるよ👇

  • no(デフォ):再起動しない
  • always:止まったら基本ずっと再起動
  • unless-stoppedalwaysに近いけど、明示停止したら復活しない
  • on-failure[:max-retries]終了コードが0以外のときだけ再起動(回数制限も可) (Docker Documentation)

しかも超大事な仕様👇

  • 再起動ポリシーは 「10秒以上ちゃんと起動した」あとに効き始める(起動できないコンテナを無限ループさせないため) (Docker Documentation)
  • 手動で止めた場合、再起動ポリシーは一旦無視される(ループ防止) (Docker Documentation)

Composeでも restart: で同じ考え方が使えるよ🧩 (Docker Documentation)


4) まず見る順番:これで9割いける🔍✅

再起動ループを見たら、この順でOK👇

  1. 状態を見る(Exited / Restarting / Up)👀
  2. ログを見る(直前に何が出た?)🪵
  3. 終了コードを拾う(1? 127? 137?)🧾
  4. inspectで「OOMKilled」「RestartCount」を確認する💣🔁
  5. 原因を直して、再起動設定は必要なら最後に戻す🔧

5) ハンズオン①:わざと再起動ループを起こして観察する🔁👀(超安全)

5-1) まず “落ちるコンテナ” を作る(12秒生きてから落ちる)⏳💥

※「10秒以上起動」しないと restart policy が効きにくい仕様があるので、わざと sleep 12 するよ (Docker Documentation)

docker run --name exit-demo --restart=always busybox sh -c 'echo "start"; sleep 12; echo "bye"; exit 1'

5-2) 状態を観察する(再起動してるはず)🔁

docker ps -a --filter name=exit-demo

5-3) ログで「落ちる瞬間」を見る🪵👀

docker logs -f exit-demo

5-4) inspectで ExitCode / OOMKilled / RestartCount を抜く🔎

docker inspect の出力には State.ExitCodeState.OOMKilled、そして RestartCount があるよ (man.archlinux.org)

docker inspect exit-demo --format 'ExitCode={{.State.ExitCode}} OOMKilled={{.State.OOMKilled}} Restarting={{.State.Restarting}}'
docker inspect exit-demo --format 'RestartCount={{.RestartCount}} StartedAt={{.State.StartedAt}} FinishedAt={{.State.FinishedAt}}'

5-5) ループを止める(まず落ち着く🧘)

docker stop exit-demo

手動で止めると、restart policy は一旦無視される(ループ防止の仕様) (Docker Documentation)


6) ハンズオン②:on-failure:3 で「3回まで」リトライさせる🎛️🔁

docker rm -f exit-demo

docker run --name exit-demo --restart=on-failure:3 busybox sh -c 'echo "start"; sleep 12; echo "bye"; exit 2'

しばらく待ってから👇

docker ps -a --filter name=exit-demo
docker inspect exit-demo --format 'ExitCode={{.State.ExitCode}} RestartCount={{.RestartCount}}'

「永遠ループにしたくない」なら、まず on-failure:3 みたいに回数制限を付けるのはめっちゃアリ👍✨ (Docker Documentation)


7) Compose版:restart: を読む/書く🧩✍️

Composeの restart: はこういう値👇(覚えやすい!)

例(観察用の最小 compose.yml):

services:
exit-demo:
image: busybox
command: sh -c 'echo "start"; sleep 12; echo "bye"; exit 1'
restart: on-failure:3

起動&観察👇

docker compose up

別ターミナルで👇

docker compose ps
docker compose logs -f

止める👇

docker compose down

8) 「Todo API」で実際に起きがちなパターン集🧠🧯(超リアル)

パターンA:Exited (0) なのにサービスが止まる😇

原因あるある

  • CMD/commandnpm test とか npm run build になってて、処理が終わったら終了してる 対策
  • サーバ起動コマンド(例:npm run dev / node dist/index.js)になってるか確認✅

パターンB:Exited (127) コマンド見つからん❓

原因あるある

  • node が入ってないイメージを使ってる
  • command: npm run dev なのに npm が無い 対策
  • イメージ(FROM)と command が噛み合ってるか確認
  • PATHや実行ファイル名もチェック

パターンC:Exited (126) 実行できない🔒

原因あるある

  • スクリプトに実行権限がない
  • sh で実行するつもりが ./start.sh を直叩きして失敗 対策
  • chmod +x、または sh start.sh で回避

パターンD:Exited (137)(メモリ不足っぽいやつ)💣

原因あるある

  • 開発中のビルド/テストが重くてOOM
  • 依存が膨れて起動直後に落ちる 対策
  • inspectOOMKilled を見る(trueならほぼ確) (man.archlinux.org)
  • コンテナのメモリ設定、不要プロセス、ビルド手順の見直し ※ただし 137=OOMと決め打ちしない(SIGKILLは他でも起きる) (Stack Overflow)

9) AI活用テンプレ🤖✨(貼るだけで強い)

9-1) “終了コード→原因候補→次の確認” を出してもらう🧠

以下は docker の状況です。終了コードから原因候補を3つに絞り、
それぞれ「確認コマンド」と「直し方の方向性」を提案して。

- docker ps -a の STATUS:(ここに貼る)
- docker logs(直前30行):(ここに貼る)
- docker inspect の抜粋:
ExitCode=...
OOMKilled=...
RestartCount=...

9-2) “再起動ループを止める最短手順” を作らせる🧯

今このコンテナが再起動ループしてる。安全に止めて原因を調べるための
「最短コマンド列」を、docker単体版とdocker compose版で出して。

10) ミニチェック(3問)🎓✅

  1. Exited (0) なのにAPIが止まるとき、まず疑うことは?🤔
  2. Exited (127)Exited (126) の違いを一言で言うと?🧾
  3. 再起動ポリシーが効く条件として「10秒」ルールがあるのはなぜ?⏱️ (Docker Documentation)

次章につながるよ🚀

終了コードで「死因の方向」が見えたら、次は コンテナの中に入って現場検証(第54章)だね🔦🕵️‍♂️✨