dockerのENTRYPOINTとCMDの書き方と使い分け、さらに併用

  • 151
    いいね
  • 0
    コメント

Dockerfile referenceDockerfile 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 オプションを使えば DockerfileENTRYPOINT の値を上書きすることも可能です。