Docker CMDとENTRYPOINTの使い方

2020-08-24
岡野 洋平
#
Amazon SES
#
#

岡野です。

DockerFileの命令である CMDENTRYPOINT について書いてみたいと思います。 

結論

  • CMDENTRYPOINT は動作は似ているが、比較しない方が理解しやすいと思う。
  • CMDはDockerFile実行時にデフォルトで実行したいコマンドを記載する。デフォルトなのでDockerFile実行時の引数をもって上書き可能。
  • ENTRYPOINT はDockerFile実行時に必ず実行したいコマンドを記載する。docker runするときに --entrypoint で上書き可能。

CMDENTRYPOINTは比較しない方がいいと思う理由

確かに動作は似ているが、初期の勉強段階で比較対象の命令として認識すると、どちらか選択する必要があるように思えてしまう。(少なくとも自分は)

CMDの動作

公式に以下の記載があります。

DockerfileではCMD命令を1つしか記述できません。 仮に複数のCMDを記述しても、最後のCMD命令しか処理されません。

では以下のDockerFileでイメージを作成し、実行してみます。

FROM alpine:3.11

CMD ["echo","use CMD"]

image生成

$ docker build -t test .

実行

$ docker run test
use CMD

実行時に引数を渡して CMD を上書く

$ docker run test echo "over ride"
over ride

echoコマンドごと上書きされたことがわかります。

ENTRYPOINTの動作

公式に以下の記載があります。

docker run image に対するコマンドライン引数は、exec 形式の ENTRYPOINT の指定要素の後に付け加えられます。 ENTRYPOINT 命令は複数記述されていても、最後の命令しか処理されません。

では以下のDockerFileでイメージを作成し、実行してみます。

FROM alpine:3.11

ENTRYPOINT ["echo","use ENTRYPOINT"]

image生成

docker build -t test .

実行

$ docker run test
use ENTRYPOINT

実行時に引数を渡して ENTRYPOINT を上書きしようとする。

$ docker run test echo "over ride"
use ENTRYPOINT echo over ride

上書きしようとして渡した引数がすべて、ENTRYPOINTで指定したechoコマンドの引数になっていることがわかります。

CMD と ENTRYPOINT の併用①

FROM alpine:3.11

ENTRYPOINT ["echo","use ENTRYPOINT and"]

CMD ["echo", "CMD"]

mage生成

docker build -t test .

実行

$ docker run test
use ENTRYPOINT and echo CMD

CMDを上書きしようとする。

$ docker run test ping 127.0.0.1
use ENTRYPOINT and ping 127.0.0.1

こちらもCMDを上書きしようとして渡した引数が、ENTRYPOINTで指定したechoコマンドの引数になっていることがわかります。

CMD と ENTRYPOINT の併用②

ENTRYPOINTCMD の順番を変えて実施してみます。

FROM alpine:3.11

CMD ["echo", "CMD and"]

ENTRYPOINT ["echo","use ENTRYPOINT"]

mage生成

docker build -t test .

実行

$ docker run test
use ENTRYPOINT echo CMD and

CMDを上書きしようとする。

$ docker run test ping 127.0.0.1
use ENTRYPOINT ping 127.0.0.1

実行される順番がDockerFileの記載と逆になっているようです。

公式に以下の記載があります。

ENTRYPOINT の exec 形式は、デフォルト実行するコマンドおよび引数として、ほぼ変わることがないものを設定します。 そして CMD 命令の 2 つある書式のいずれでもよいので、変更が必要になりそうな内容を追加で設定します。
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

上記より、CMDENTRYPOINT が同時に記載された場合、実行される順番は自動的にENTRYPOINTCMDになるのではと考えています。

最後に

頑固なENTRYPOINT、柔軟なCMDといったところでしょうか。

株式会社Grandreamでは、フルリモートであなたのスキルを活かし、活躍できるエンジニアを募集しております。 詳しくは採用ページをご確認いただき、お気軽にお問い合わせください。

株式会社グランドリームでは、AWSを駆使した開発からUI/UXデザインまで、Webアプリケーションに関するすべての要望に応えます。
まずは一度お気軽にご相談ください。

お問い合わせはこちら