2019-06-01 追記
この記事より DockerfileのCMDとENTRYPOINTを改めて解説する - Qiita のほうがお勧めです。
元記事
Dockerfile referenceやDockerfile Best PracticesにENTRYPOINTとCMDの書き方と使い分け、さらに併用について書かれていました。
ENTRYPOINTとCMDの引数の書式
ENTRYPOINTの書式は以下の2種類があります。
- ENTRYPOINT ["executable", "param1", "param2"] (シェルを介さずに実行。この形式を推奨)
- ENTRYPOINT command param1 param2 (シェルを介して実行)
シェルを介して実行するほうは/bin/sh -cを使って実行するそうです。
CMDの書式は以下の3種類です。
- CMD ["executable","param1","param2"] (シェルを介さずに実行。この形式を推奨)
- CMD ["param1","param2"] (ENTRYPOINTのデフォルト引数として利用する場合)
- CMD command param1 param2 (シェルを介して実行)
ENTRYPOINTとCMDの併用
Dockerfile Best Practicesの"5. CMD and ENTRYPOINT better together"にENTRYPOINTとCMDを併用する例があります。
ENTRYPOINT ["/usr/bin/rethinkdb"]
CMD ["--help"]
のように書きます。
すると、docker runのときに
docker run crosbymichael/rethinkdb
のようにイメージの後に引数無しで実行した場合は、CMDの--helpが使われて、/usr/bin/rethinkdb --helpが実行されることになります。
一方、
docker run crosbymichael/rethinkdb --bind all
のようにイメージの後に引数有りで実行した場合は、CMDの値は使われず、/usr/bin/rethinkdb --bind allが実行されることになります。
docker run --entrypoint="" で変更も可能
docker runのリファレンスによると --entrypoint
オプションを使えば Dockerfile
の ENTRYPOINT
の値を上書きすることも可能です。