DockerfileのCMDとENTRYPOINTを読み解く(3/3) — CMD/ENTRYPOINT/Shell/Exec一覧表 #docker #dockerfile
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
Dockerイメージを作成するためのDockerfileには多くの命令があります。中でもCMD命令とENTRYPOINT命令は、コンテナ内で実行するPID 1のプロセスを指定するものです。言いかえると「このイメージは一体何をするのか、何のためのイメージなのか」という性質を決定づける命令です。
このCMD命令とENTRYPOINT命令についての理解を深めるため、全3回のブログシリーズとして掲載していきます。なお、Linux版Dockerコンテナの内容であることをご了承ください。
- 第1回: Shell形式とExec形式とは何か
- 第2回: CMD命令とENTRYPOINT命令の基礎
- 第3回: CMD/ENTRYPOINT/Shell/Exec一覧表 ← 本稿
本稿では、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化しましたのでご自由にお持ちください。
一連のブログシリーズが皆様のお役に立てば幸いです。
- 第1回: Shell形式とExec形式とは何か
- 第2回: CMD命令とENTRYPOINT命令の基礎
- 第3回: CMD/ENTRYPOINT/Shell/Exec一覧表 ← 本稿
また、クリエーションラインではMirantis社公認Dockerトレーニングを提供しております。さらにDockerを習得するために本トレーニングの受講を是非ご検討ください。