見出し画像

【Docker】EntrypointとCMDの違いは?(動画付き)


本日は、こちらの記事を使い、EntrypointCMDの違いを見ていきたいと思います。

非常にわかりやすかったので、ぜひ読んでみてください。

動画はこちらになります。

1 centosを起動するとなぜbash接続するの?

次のように「centos」というイメージのコンテナを起動すると、bash起動されます。

docker run -it centos

(ちなみに、オプションの「-i」はinteractive、「-t」はttyの省略です。)

理由は「centos」というイメージ自体にbash起動のコマンドが入っているからです。

「ps ax」で見てみると、下のようにPID:1で「/bin/bash」が実行されていました。

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

https://atmarkit.itmedia.co.jp/ait/articles/1603/28/news022.html

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

https://github.com/CentOS/sig-cloud-instance-images/blob/52cc14a6dd2efc45265417a4690964d32cf13857/docker/Dockerfile#L14

2 引数の指定によるCMDの上書き

そして、CMDは実行時に引数を指定することで上書きされます。

下のように「/bin/sh」を引数にしたことで、bashではなく、shが起動しました。

では、次に、pingで上書きしてみます。

docker run -it centos ping -c 3 1.1.1.1

下のように、pingが行われただけで、bashは起動されませんでした。

(pingの参考です。)

https://atmarkit.itmedia.co.jp/ait/articles/0108/30/news002.html

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

今回は以上です。


いいなと思ったら応援しよう!

ユウキ
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊