fbpx

DockerfileのCMDとENTRYPOINTを読み解く(3/3) — CMD/ENTRYPOINT/Shell/Exec一覧表 #docker #dockerfile

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

New call-to-action

Dockerイメージを作成するためのDockerfileには多くの命令があります。中でもCMD命令とENTRYPOINT命令は、コンテナ内で実行するPID 1のプロセスを指定するものです。言いかえると「このイメージは一体何をするのか、何のためのイメージなのか」という性質を決定づける命令です。

このCMD命令とENTRYPOINT命令についての理解を深めるため、全3回のブログシリーズとして掲載していきます。なお、Linux版Dockerコンテナの内容であることをご了承ください。

本稿では、Dockerfileでの記載を

  • Shell形式
  • Exec形式

の二種類に大きく分け、

Dockerfile→
↓docker container runに
CMDのみ ENTRYPOINTのみ CMDとENTRYPOINTの組み合わせ
引数を与えない
引数を与える
--entrypointオプションを与えた
--entrypointオプションとさらに引数を与えた

それぞれの場合でどのような挙動を取るかを一覧表としてまとめ、特に注意する点を説明していきます。

Shell形式

Dockerfile→
↓docker container run
FROM debian:9
CMD ping
FROM debian:9
ENTRYPOINT ping
FROM debian:9
CMD 8.8.8.8
ENTRYPOINT ping
run イメージ名 CMD命令のpingのみを実行するので
「ping: missing host operand」エラー
ENTRYPOINT命令のpingのみを実行するので
「ping: missing host operand」エラー
ENTRYPOINT命令がShell形式の場合、CMD命令の引数は無視するので、ENTRYPOINT命令のpingのみを実行し「ping: missing host operand」エラー
run イメージ名 1.1.1.1 runコマンドの引数はCMD命令の引数を上書きし、「1.1.1.1」そのものを実行するので「"1.1.1.1": executable file not found」エラー ENTRYPOINT命令がShell形式の場合、CMD命令の引数は無視するので、ENTRYPOINT命令のpingのみを実行し「ping: missing host operand」エラー ENTRYPOINT命令がShell形式の場合、runコマンドの引数とCMD命令の引数は無視するので、ENTRYPOINT命令のpingのみを実行し「ping: missing host operand」エラー
run イメージ名 date runコマンドの引数はCMD命令の引数を上書きし、「date」コマンドを実行して現在の日時を表示 ENTRYPOINT命令がShell形式の場合、CMD命令の引数は無視するので、ENTRYPOINT命令のpingのみを実行し「ping: missing host operand」エラー ENTRYPOINT命令がShell形式の場合、runコマンドの引数とCMD命令の引数は無視するので、ENTRYPOINT命令のpingのみを実行し「ping: missing host operand」エラー
run -ti --entrypoint bash イメージ名 --entrypointオプションを優先してCMD命令を無視し、bashを実行 --entrypointオプションはENTRYPOINT命令を上書きし、bashを実行 --entrypointオプションはENTRYPOINT命令を上書きしてCMD命令を無視し、bashを実行
run -ti --entrypoint bash イメージ名 1.1.1.1 --entrypointオプションを優先してCMD命令を無視し、「1.1.1.1」を引数としてbashを実行するので「1.1.1.1: No such file or directory」エラー --entrypointオプションはENTRYPOINT命令を上書きし、「1.1.1.1」を引数としてbashを実行するので「1.1.1.1: No such file or directory」エラー --entrypointオプションはENTRYPOINT命令を上書きし、CMD命令を無視して「1.1.1.1」を引数としてbashを実行するので「1.1.1.1: No such file or directory」エラー
run -ti --entrypoint bash イメージ名 date --entrypointオプションを優先してCMD命令を無視し、「date」を引数としてbashを実行するので「/bin/date: cannot execute binary file」エラー --entrypointオプションはENTRYPOINT命令を上書きし、「date」を引数としてbashを実行するので「/bin/date: cannot execute binary file」エラー -entrypointオプションはENTRYPOINT命令を上書きし、CMD命令を無視して「date」を引数としてbashを実行するので「/bin/date: cannot execute binary file」エラー

背景色を黄色とした項目は、第2回「CMD命令とENTRYPOINT命令の基礎」で見た、ENTRYPOINT命令をShell形式で記述した場合、CMD命令も「docker container run [イメージ名] [引数]」の引数も無視する、という気をつけなければいけない特徴の部分です。

Exec形式

Dockerfile→
↓docker container run
FROM debian:9
CMD ["ping"]
FROM debian:9
ENTRYPOINT ["ping"]
FROM debian:9
CMD ["8.8.8.8"]
ENTRYPOINT ["ping"]
run イメージ名 CMD命令のpingのみを実行するので
「ping: missing host operand」エラー
ENTRYPOINT命令のpingのみを実行するので
「ping: missing host operand」エラー
ENTRYPOINT命令のpingにCMD命令の8.8.8.8をデフォルトの引数として実行するので「ping 8.8.8.8」を正常に実行
run イメージ名 1.1.1.1 runコマンドの引数はCMD命令の引数を上書きし、「1.1.1.1」そのものを実行するので「"1.1.1.1": executable file not found」エラー runコマンドの引数はENTRYPOINT命令のコマンドの引数となるため、「ping 1.1.1.1」を正常に実行 runコマンドの引数はCMD命令の引数を上書きし、ENTRYPOINT命令の引数となるため、「ping 1.1.1.1」を正常に実行
run イメージ名 date runコマンドの引数はCMD命令の引数を上書きし、「date」コマンドを実行して現在の日時を表示 runコマンドの引数はENTRYPOINT命令のコマンドの引数となるため、「ping date」を実行してしまい「ping: unknown host」エラー runコマンドの引数はCMD命令の引数を上書きし、ENTRYPOINT命令の引数となるため、「ping date」を実行してしまい「ping: unknown host」エラー
run -ti --entrypoint bash イメージ名 --entrypointオプションを優先してCMD命令を無視し、bashを実行 --entrypointオプションはENTRYPOINT命令を上書きし、bashを実行 --entrypointオプションはENTRYPOINT命令を上書きしてCMD命令を無視し、bashを実行
run -ti --entrypoint bash イメージ名 1.1.1.1 --entrypointオプションを優先してCMD命令を無視し、「1.1.1.1」を引数としてbashを実行するので「1.1.1.1: No such file or directory」エラー --entrypointオプションはENTRYPOINT命令を上書きし、「1.1.1.1」を引数としてbashを実行するので「1.1.1.1: No such file or directory」エラー --entrypointオプションはENTRYPOINT命令を上書きし、CMD命令を無視して「1.1.1.1」を引数としてbashを実行するので「1.1.1.1: No such file or directory」エラー
run -ti --entrypoint bash イメージ名 date --entrypointオプションを優先してCMD命令を無視し、「date」を引数としてbashを実行するので「/bin/date: cannot execute binary file」エラー --entrypointオプションはENTRYPOINT命令を上書きし、「date」を引数としてbashを実行するので「/bin/date: cannot execute binary file」エラー -entrypointオプションはENTRYPOINT命令を上書きし、CMD命令を無視して「date」を引数としてbashを実行するので「/bin/date: cannot execute binary file」エラー

Exec形式の場合は、これまでの知識を前提とした素直な動作を行います。

まとめ

CMD命令とENTRYPOINT命令についての理解を深めるため、「DockerfileのCMDとENTRYPOINTを読み解く」と題して全3回のブログシリーズを掲載してきました。
CMD命令・ENTRYPOINT命令とそれに影響を与えるShell形式・Exec形式のいろいろな特徴について例をまじえつつ順を追って見てきた今ならば、「このイメージは一体何をするのか、何のためのイメージなのか」ということを自在に決定・実行できるようになっているかと思います。

本稿の一覧表をPDF化しましたのでご自由にお持ちください。

New call-to-action

一連のブログシリーズが皆様のお役に立てば幸いです。

また、クリエーションラインではMirantis社公認Dockerトレーニングを提供しております。さらにDockerを習得するために本トレーニングの受講を是非ご検討ください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA