docker run したコンテナがすぐ終了して起動し続けられない
コンテナはメインプロセス(PID 1)が終了すると停止します。
常駐プロセスが無い、デタッチで対話シェルを起動した、CMD が即終了する、のいずれかが原因です。
docker logs と docker ps -a で終了コードを確認します。
#docker#container#exit#run#troubleshooting
要約
Docker コンテナは「PID 1 のプロセスが生きている間だけ」動き続けます。docker run 直後に停止するのは、メインプロセスが終了したからです。
原因の切り分けには docker ps -a で終了コードを、docker logs <コンテナ> で標準出力を確認するのが第一歩です。
よくある原因
- 常駐しないコマンド:
CMD ["echo", "hello"]のように一瞬で終わるコマンドだと、出力後すぐ終了コード 0 で停止する。 - デーモンを background 起動:
nginxをdaemon off;無しで起動すると、本体がフォークして PID 1 が即終了する。 - 対話シェルの誤起動:
docker run image bashを-it無しで実行すると、入力が無く即 EOF となり終了する。 - アプリのクラッシュ: 設定ミスや例外で異常終了。
終了コードが1や137(OOM Kill)になる。
解決策
1. まず終了理由を確認する
docker ps -a # STATUS の Exited (コード) を見る
docker logs <container> # 例外やスタックトレースを確認終了コード 0 なら「正常に処理が終わった」、137 はメモリ不足等による強制終了です。
2. フォアグラウンドで常駐させる
サーバ系はフォアグラウンド実行が必須です。
# nginx をフォアグラウンドで保持
CMD ["nginx", "-g", "daemon off;"]3. 対話的に使うなら -it を付ける
docker run -it ubuntu bash-i(標準入力を保持)と -t(疑似 TTY)の両方が必要です。
デタッチで常駐させたい場合のみ -d を使い、その際は常駐プロセスを CMD に指定します。docker run のオプションは公式リファレンスが一次情報です。