毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
ShellフォームとExecフォームの違いとENTRYPOINTとCMDの使い分けについて
本記事は、以下のクリエーションライン様の記事を参考にさせていただいております。
0. はじめに
社内で「ShellフォームとExecフォームの違いとENTRYPOINTとCMDの使い分けがよくわからん」という話が合ったのでまとめてみた、という話になります。
1. ENTRYPOINTとCMDは何が違うの?
ENTRYPOINTとCMDはdocker runしたときのデフォルトで実行されるコマンドですが、CMDはdocker run時の引数でオプションとして指定できます。
例: s3cmdを実行したいDockerイメージ
#Dockerfile
ENTRYPOINT ["s3cmd"]
CMD ["--help"]
docker runで引数を渡して実行すると、CMDの指定が上書きされて実行できる
つまり、
s3cmd ls s3://mybucket
が実行される
CMDには基本的にデフォルトのオプションを記載する
2. Shell formとExec formについて
簡単に言うと
「Dockerコンテナ内でアプリケーションを呼び出す(起動する)ときの書式」です
2-2. Shell formとExec formの中身の違い
Shell formは、以下のようなDockerfile内の書式を右のように変換してDockerコンテナ内で実行します
Exec formは、以下のようなDockerfile内の書式を右のように変換してDockerコンテナ内で実行します
- 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の使い分け
どちらもコマンドを実行できるという点では同じ
ではどちらを使ってもいいのでは??
3-1. docker run run-param1を実行してみる
以下のENTRYPOINTでdocker run run-param1 すると下のようになります
以下のCMDでdocker run run-param1 すると下のようになります
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)
以下のCMDでdocker run run-param1すると右のようになります
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