できない.dev

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 <コンテナ> で標準出力を確認するのが第一歩です。

よくある原因

  1. 常駐しないコマンド: CMD ["echo", "hello"] のように一瞬で終わるコマンドだと、出力後すぐ終了コード 0 で停止する。
  2. デーモンを background 起動: nginxdaemon off; 無しで起動すると、本体がフォークして PID 1 が即終了する。
  3. 対話シェルの誤起動: docker run image bash-it 無しで実行すると、入力が無く即 EOF となり終了する。
  4. アプリのクラッシュ: 設定ミスや例外で異常終了。
    終了コードが 1137(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 のオプションは公式リファレンスが一次情報です。

この記事は役立ちましたか?