(Docker) CMDとENTRYPOINTの「役割」と「違い」を解説

CMDとENTRYPOINTの違い

 

Dockerを使っていて、
CMDとENTRYPOINTの役割と違いがよくわからなかったので、調べたことをメモ

 

結論①「CMD」と「ENTRYPOINT」の役割

CMDとENTRYPOINTとは、どちらもDockerfileに記述するコマンドのこと。

役割としては、両者共に
「コンテナ実行時に、コンテナに対し実行したいコマンドを実行する」ことだ

docker-cmd-entrypoint
CMDとENTRYPOINT(役割)

CMD:コンテナ実行時、デフォルトで実行したいコマンドを記載する。デフォルトなのでコンテナ自動時、引数で上書き可能。またENTRYPOINTの指定がある場合、ENTRYPOINTの指定の後に続けて付け加えられる。

ENTRYPOINT:コンテナ実行時に必ず実行したいコマンドを記載する。docker runするときに –entrypoint で上書き可能。

 

結論②「CMD」と「ENTRYPOINT」の違い




「CMD」と「ENTRYPOINT」役割の違いとしては、簡単に言うと、
「CMD:変更部分担当、ENTRYPOINT:固定部分担当」ってとこだろうか。

CMD-ENTRYPOINTの役割の違いの画像

CMDはENTRYPOINTの後に続くコマンドを指定する。
そのため、(固定の)ENTRYPOINTに対し変更可能性の高い内容をCMDに記述する

CMDとENTRYPOINT(違い)

CMD:変更部分担当

ENTRYPOINT:固定部分担当

 

例として、ホストとの通信を確認するpingコマンドで使い方の例を紹介する。
Dockerfileを以下のように編集する。

ENTRYPOINT ["ping","-c","1"]

CMD ["localhost"]

 

ENTRYPOINTが、「pingを一回実行するよ」と言う固定部分。
CMDが「(pingを)localhostに対して」と言う変更可能性のある部分だ。

このイメージをビルドして実行すると「ping -c 1 localhost」が実行される。

 

CMDの挙動を確認

では実際に、CMDの挙動を確認していく。

まずはDockerfileにCMDを記述してイメージをビルドする。
下記ではコンテナ実行時に「test CMD」と出力するように記述。

## phpのイメージ
FROM php:7.3-apache

## CMD:コンテナ実行時に実行するデフォルト
CMD ["echo","test CMD"]

作ったイメージでコンテナ実行(引数なし)

docker run php:7.3-apache

出力内容

test CMD

CMDの記述(デフォルト)が実行されたのが分かる

 

次にコンテナ実行時、引数ありでの上書きを確認する。

docker run php:7.3-apache echo overWrite

出力内容

overWrite

出力内容が上書きされた。

 

ENTRYPOINTの挙動を確認

次にDockerfileにENTRYPOINTを記述してイメージをビルドする。

## phpのイメージ
FROM php:7.3-apache

## ENTRYPOINT:コンテナ実行時に必ず実行する
ENTRYPOINT ["echo","This is ENTRYPOINT"]

作ったイメージでコンテナ実行

docker run php:7.3-apache

出力内容

This is ENTRYPOINT

ENTRYPOINTの記述が実行されたのが分かる

 

CMDとENTRYPOINTの組み合わせの挙動を確認

最後にCMDとENTRYPOINTの組み合わせの挙動を確認する

CMDの記述が、ENTRYPOINTの記述の後に付け加えられることを確認する(内容は適当)

## phpのイメージ
FROM php:7.3-apache

## ENTRYPOINT:コンテナ実行時に必ず実行する
ENTRYPOINT ["echo","This is ENTRYPOINT"]

## CMD:コンテナ実行時に実行するデフォルト
CMD ["echo","test CMD"]

作ったイメージでコンテナ実行

docker run php:7.3-apache

出力内容

This is ENTRYPOINT echo test CMD

CMDの記述がENTRYPOINTの記述の後に付け加えられた

 

CMDとENTRYPOINTの「役割」と「違い」まとめ

役割としてはどちらも「コンテナ実行時に、コンテナに対し実行したいコマンドを実行する」ことに変わりはない。ただ違いとして、ENTRYPOINTは必ず実行するコマンド(固定)を記述するのに対し、CMDでは、ENTRYPOINTに続く、変更可能性の高い要素を記述する。

 

 

 

Dockerとは?概念・できることを分かりやすく解説するよ

 

https://www.docker.com/

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。