質問: Dockerfileで`CMD`と`ENTRYPOINT`の両方が指定されていると、`docker run`する際は`CMD`に指定したコマンドは直接実行されず`ENTRYPOINT`の引数として渡されると思います。 しかし、`docker start`の際は、`CMD`に記載したコマンドのみが実行されているように見えます。これはなぜでしょうか? 1. `docker start`時は`CMD`が実行される仕様なのでしょうか? 2. それとも、`CMD`と`ENTRYPOINT`の記述順序によるのでしょうか?(上記の例では`CMD`が後に記述されています) 3. そもそも`docker start`が電源オンのように解釈していることが間違っているのでしょうか?(`docker stop`したところから再開、みたいなイメージが正しいんでしょうか?) また、上記仕様が記載されているページをご存知であればご紹介いただけるとありがたいです。
回答: ### docker run == docker create + docker start 上記のページ (英語ですが、、)などを参照すると、 `docker run` は `docker create` と `docker start` を一気にやるためのコマンドだと書いてあります。 ### コンテナが start 時に実行されるコマンドは、コンテナ作成時に決定されている。 docker create のオプションや例を見ていると、コンテナはその作成時に、何のコマンドを実行するコンテナなのかが確定している様子です。 例: ``` $ docker create -t -i fedora bash 6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752 $ docker start -a -i 6d8af538ec5 bash-4.2# ``` ### どこで確認できるか docker inspect すると、 `.[].Config.Cmd` の場所に、 run/create 時に指定されたコマンドデータが入っているのが確認できると思います。もし、 run/creat 時に指定していない場合には、 Dockerfile にて `CMD` によって指定されたデフォルトコマンドが入っているのが確認できるかと思います。 ### cmd と entrypoint の違い 上記などを参考にすると、わかりやすいかと思いますが、一言でまとめると: * entrypoint: 基本的に、ここで指定される引数に対して追記する形で、 start 時に実行されるコマンドが決定される。 * cmd: docker run/create 時に、指定するプログラム引数が、与えられなかった場合のデフォルト値 ### 質問に答えると 1. docker start 時には、 entrypoint + コンテナの Cmd として設定されている値でもってプロセスが実行されます。 2. CMD と Entrypoint は、その両方によって、実際に実行されるコマンドが確定します。基本的には、 Entrypoint + cmd です。詳細は上で述べたリンクなどを参照。 3. docker run == docker create (コンテナを作る) + docker start (電源 on) だと解釈すれば、電源 on であるといえそうです。