LoginSignup
1
0

ShellフォームとExecフォームの違いとENTRYPOINTとCMDの使い分けについて

Posted at

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

image.png
ShellフォームとExecフォームの違いとENTRYPOINTとCMDの使い分けについて

本記事は、以下のクリエーションライン様の記事を参考にさせていただいております。

DockerfileのCMDとENTRYPOINTを読み解く(3/3) - CMD/ENTRYPOINT/Shell/Exec一覧表 #docker #dockerfile - クリエーションライン株式会社

0. はじめに

社内で「ShellフォームとExecフォームの違いとENTRYPOINTとCMDの使い分けがよくわからん」という話が合ったのでまとめてみた、という話になります。

1. ENTRYPOINTとCMDは何が違うの?

ENTRYPOINTとCMDはdocker runしたときのデフォルトで実行されるコマンドですが、CMDはdocker run時の引数でオプションとして指定できます。

例: s3cmdを実行したいDockerイメージ

#Dockerfile
ENTRYPOINT ["s3cmd"]
CMD ["--help"]

image.png

docker runで引数を渡して実行すると、CMDの指定が上書きされて実行できる

image.png

つまり、

s3cmd ls s3://mybucket

が実行される

CMDには基本的にデフォルトのオプションを記載する

2. Shell formとExec formについて

簡単に言うと
「Dockerコンテナ内でアプリケーションを呼び出す(起動する)ときの書式」です

image.png

2-2. Shell formとExec formの中身の違い

Shell formは、以下のようなDockerfile内の書式を右のように変換してDockerコンテナ内で実行します

image.png

Exec formは、以下のようなDockerfile内の書式を右のように変換してDockerコンテナ内で実行します

image.png

image.png

  • Shell formはsh経由で実行されるので/bin/shが必須
  • /bin/sh経由で実行されるので変数展開が可能
  • しかし、/bin/sh の変数展開を悪用される可能性もある
  • 基本的に攻撃面を減らすためにExec formを使うべき
  • しかし、Exec fromは変数展開できないのでENTRYPOINTとCMDを組み合わせる

DockerfileのCMDとENTRYPOINTを読み解く(1/3) - Shell形式とExec形式とは何か - クリエーションライン株式会社
https://www.creationline.com/lab/39662

3. ENTRYPOINTとCMDの使い分け

どちらもコマンドを実行できるという点では同じ

image.png

ではどちらを使ってもいいのでは??

image.png

3-1. docker run run-param1を実行してみる

以下のENTRYPOINTでdocker run run-param1 すると下のようになります

image.png

以下のCMDでdocker run run-param1 すると下のようになります

image.png

ENTRYPOINTはdocker run <オプション> で上書きされない
CMDはdocker run <オプション> で上書きされる

DockerfileのCMDとENTRYPOINTを読み解く(2/3) - CMD命令とENTRYPOINT命令の基礎 - クリエーションライン株式会社
https://www.creationline.com/lab/39705

4. 結局なにが正解?

できるだけ Exec formを使う

/bin/shを使わないことによる攻撃面の削減
変数展開によるインジェクション発生の削減

5. ENTRYPOINTとCMDを組み合わせる

Exec formを使ったときにパラメーターを外部から渡すことができる

以下のENTRYPOINTとCMDでdocker runすると右のようになります(Exec form)

image.png

以下のCMDでdocker run run-param1すると右のようになります
image.png

6. まとめ

ShellフォームとExecフォームの違いとENTRYPOINTとCMDの使い分けについて解説してみました。

7. 参照

DockerfileのCMDとENTRYPOINTを読み解く(1/3) - Shell形式とExec形式とは何か #docker #dockerfile - クリエーションライン株式会社
https://www.creationline.com/tech-blog/39662

DockerfileのCMDとENTRYPOINTを読み解く(2/3) - CMD命令とENTRYPOINT命令の基礎 #docker #dockerfile - クリエーションライン株式会社
https://www.creationline.com/tech-blog/39705

DockerfileのCMDとENTRYPOINTを読み解く(3/3) - CMD/ENTRYPOINT/Shell/Exec一覧表 #docker #dockerfile - クリエーションライン株式会社
https://www.creationline.com/tech-blog/39730

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0