第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-stopped:alwaysに近いけど、明示停止したら復活しないon-failure[:max-retries]:終了コードが0以外のときだけ再起動(回数制限も可) (Docker Documentation)
しかも超大事な仕様👇
- 再起動ポリシーは 「10秒以上ちゃんと起動した」あとに効き始める(起動できないコンテナを無限ループさせないため) (Docker Documentation)
- 手動で止めた場合、再起動ポリシーは一旦無視される(ループ防止) (Docker Documentation)
Composeでも restart: で同じ考え方が使えるよ🧩 (Docker Documentation)
4) まず見る順番:これで9割いける🔍✅
再起動ループを見たら、この順でOK👇
- 状態を見る(Exited / Restarting / Up)👀
- ログを見る(直前に何が出た?)🪵
- 終了コードを拾う(1? 127? 137?)🧾
inspectで「OOMKilled」「RestartCount」を確認する💣🔁- 原因を直して、再起動設定は必要なら最後に戻す🔧
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.ExitCode や State.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: はこういう値👇(覚えやすい!)
no/always/on-failure[:max-retries]/unless-stopped(Docker Documentation)
例(観察用の最小 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/commandがnpm 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
- 依存が膨れて起動直後に落ちる 対策
inspectのOOMKilledを見る(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問)🎓✅
Exited (0)なのにAPIが止まるとき、まず疑うことは?🤔Exited (127)とExited (126)の違いを一言で言うと?🧾- 再起動ポリシーが効く条件として「10秒」ルールがあるのはなぜ?⏱️ (Docker Documentation)
次章につながるよ🚀
終了コードで「死因の方向」が見えたら、次は コンテナの中に入って現場検証(第54章)だね🔦🕵️♂️✨