【Docker】docker run したのにコンテナが Created 状態でストップするパターン

  • 2022年3月17日
  • 2022年3月18日
  • Docker

 Docker は様々な仮想環境を実行できるツールです。Docker はコマンドラインで使用することができ、docker run コマンドはイメージからコマンドを直に実行するために便利なコマンドです。また Docker は仮想環境を定義するイメージから実際に動かすコンテナを作ります。docker run コマンドを実行する際、コンテナは次の状態遷移で動作します(コンテナの状態遷移には図に加えて Paused があります。 Up 9 hours(Paused)の様に表示され、docker unpause でプロセスもそのままに再開できます )。

 docker run コマンドはイメージからコンテナを生成し、コンテナにコマンドを実行させます。このため docker run コマンドが完了した後のコンテナの状態は Exited になる様に思えますが、実は違います。これを示すコマンド実行例が次です。

# 成功パターン
>docker run --entrypoint="" --name="success" alpine:3.12.0 echo hogehoge

# Docker が実行コマンドのファイルを見つけられないパターン
>docker run --entrypoint="" --name="not_found_commnad" alpine:3.12.0 hogehoge
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "hogehoge": executable file not found in $PATH: unknown.

# シェルが実行コマンドのファイルを見つけられないパターンその1
>docker run --entrypoint="" --name="not_found_commnad_with_sh" alpine:3.12.0 sh hogehoge
sh: can't open 'hogehoge': No such file or directory

# シェルが実行コマンドのファイルを見つけられないパターンその2
>docker run --entrypoint="sh" --name="not_found_commnad_with_entry_sh" alpine:3.12.0 hogehoge
sh: can't open 'hogehoge': No such file or directory

# 結果
>docker ps -a --filter ancestor=alpine:3.12.0
CONTAINER ID   IMAGE           COMMAND         CREATED         STATUS                     PORTS     NAMES
c0ba3f9e03d1   alpine:3.12.0   "sh hogehoge"     5 seconds ago        Exited (2) 4 seconds ago                  not_found_commnad_with_entry_sh
07cbb8bc1188   alpine:3.12.0   "sh hogehoge"     9 seconds ago        Exited (2) 9 seconds ago                  not_found_commnad_with_sh
2ccb9adc7823   alpine:3.12.0   "hogehoge"        13 seconds ago       Created                                   not_found_commnad
8aacd014837c   alpine:3.12.0   "echo hogehoge"   About a minute ago   Exited (0) About a minute ago             success

 Docker 自体がコマンドを実行できない場合、メインプロセスが立ち上がらず、ステータスは Created のままでコンテナは放置されます。このメインプロセスが立ち上がらないパターンは色々ですが、一つが例にある Docker がコンテナ内に実行すべきコマンドを見つけられないパターンです。私的にシェルをエントリーポイントにしているイメージが多い理由の一つがこれだと思います。

 具体的なメインプロセスが立ち上がらないパターンですが他にはメモリの問題が考えられます。真に把握するのであればソースコードを追うべきなのですが自分はソースコードを追うのを諦めてしまいました。 Docker のソースコードの次の部分がコンテナを立ち上げてメインプロセスをスタートする部分です。この処理でプロセスがスタートできずエラーが返れば Created でコンテナが放棄されます。
runc/container_linux.go at 98b75befc44c8f0f4a76e7cf8f100be834e624e8 · opencontainers/runc#L332

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG