
【Docker】EntrypointとCMDの違いは?(動画付き)
本日は、こちらの記事を使い、EntrypointとCMDの違いを見ていきたいと思います。
非常にわかりやすかったので、ぜひ読んでみてください。
動画はこちらになります。
1 centosを起動するとなぜbash接続するの?
次のように「centos」というイメージのコンテナを起動すると、bash起動されます。
docker run -it centos

(ちなみに、オプションの「-i」はinteractive、「-t」はttyの省略です。)
理由は「centos」というイメージ自体にbash起動のコマンドが入っているからです。
「ps ax」で見てみると、下のようにPID:1で「/bin/bash」が実行されていました。

(下はpsコマンドの参考です。)

具体的には、下のようにCMD ["/bin/bash"]が組み込まれています。

2 引数の指定によるCMDの上書き
そして、CMDは実行時に引数を指定することで上書きされます。
下のように「/bin/sh」を引数にしたことで、bashではなく、shが起動しました。

では、次に、pingで上書きしてみます。
docker run -it centos ping -c 3 1.1.1.1
下のように、pingが行われただけで、bashは起動されませんでした。

(pingの参考です。)

3 DockerfileでCMD付きのimageを作る
3ー1 Dockerfileを作る
まずは、Dockerfileを作りましょう。
下のようにFROMで、どのimageをもとに作るのかを作成し、その下にCMDを入れています。

FROM centos:latest
CMD ["ping","-c","3","1.1.1.1"]
CMDでやりたい処理を記入しました。
3ー2 Dockerfileから新しいimageを作る
Dockerfileができたので、次のコマンドで、imageを作ります。
docker image build -t test1 .

これでimageを作ることができました。
3ー3 コンテナを起動する
imageができましたので、できたimageを用いてコンテナを起動しましょう。
3ー3ー1 引数なしで実行する
では、下のように引数なしで実行してみましょう。
docker run test1
下のようにCMDに記載したコマンド(ping)が実行されました。

また、同時に、もともと「centos」に書かれていたCMD["/bin/bash"]は実行されていないこともわかりました。
3ー3ー2 引数をつけて実行する
では、次のようにして、引数をつけるとどうでしょう。
docker run test1 ping -c 10 1.1.1.1
結果はpingが3回でもなく、13回でもなく、10回実行されました。

これによって、もともと設定されていた3回のpingが上書きされたことがわかりました。
以上から、次のことが確認できました。
①imageの中に書かれたCMDが実行される
②コンテナ起動時に引数を設定すると、CMDが上書きされる
4 DockerfileでENTRYPOINT付きのimageを作る
4ー1 Dockerfileを作成し、imageを作る
下のようにDockerfileを作り、imageを作りました。
「ENTRYPOINT」以外は前章と同じです。
docker image build -t test2 .

4ー2 コンテナを起動する
では、コンテナを起動してみましょう。
4ー2ー1 引数なしで実行する
下のように、ENTRYPOINTで指定したコマンドが実行されています。

docker run test2
4ー2ー2 引数をつけて実行する
下のように、ENTRYPOINTだけではエラーになってしまいました。

docker run test2 ping -c 10 1.1.1.1
5 CMDとENTRYPOINTを組み合わせる
では、最後に組み合わせてみましょう。
下のようにすることで、ENTRYPOINTの箇所は不変とし、CMDの箇所を引数によって変えられるようにします。
docker image build -t test3 .

では、引数がない場合と、ある場合で比べてみましょう。
下のように引数がなければ、そのまま実行し、存在すれば、CMD部分を変更して実施します。
docker run test3
docker run test3 6 8.8.8.8

今回は以上です。
いいなと思ったら応援しよう!
