はじめに
Dockerfileを作る時に使うCMDとENTRYPOINTの使い分けについてよく忘れるのでメモとして残します。
CMD
5秒スリープするコンテナーを作成するためのDockerfileあるとします。
From Ubuntu
# CMD command param1
CMD sleep 5
OR
From Ubuntu
# CMD ["command", "param1"]
CMD ["sleep", "5"]
# 最初の要素が実行可能ファイル・コマンド
# 引数をスペース空けて指定するのがダメ
上記のファイルをビルドし、コンテナーを作ります。
docker build -t sleeper .
そして、コンテナーを実行します。
docker run sleeper
※コンテナーが実行され、5秒スリープし、終了します。
では、以下のコマンドを実行するとどうなりますでしょうか?
docker run sleeper sleep 10
※コンテナーが実行され、10秒スリープし、後終了します。
つまり、コマンドラインで指定したコマンドに上書きされます。
ENTRYPOINT
例えば、以下のようにスリープ時間のみを引数と与えたい時どうしたら良いでしょうか。
docker run sleeper 10
この時に出てくるのがEntrypoint。
From Ubuntu
# ENTRYPOINT ["command"]
ENTRYPOINT ["sleep"]
Docker runした時にコマンドラインで指定した引数が「sleep」の引数として追加されます。
※しかし、引数なしでコマンドを実行したらどうなりますでしょうか?
docker run sleeper
sleepに引数がなくエラーになります。
CMD & ENTRYPOINT
引数のデフォルト値を設定するにはどうしたらよいでしょうか?例えば、以下のどのコマンドを実行しても正しく動作するにはどうしたらよろしいでしょうか?
docker run sleeper
docker run sleeper 20
docker run sleeper 10
このような時にはCMDとENTRYPOINT両方使います。
From Ubuntu
# ENTRYPOINTの場合は末尾に引数として追加されるため、
# コマンドラインで指定したものがあれば追加される
ENTRYPOINT ["sleep"]
# CMDの場合はコマンドラインで指定したもので上書きされるため、
# 指定があればその値を採用、なければ下記の「5」を採用
CMD ["5"]
補足
コマンドラインでEntrypointを変更する事ができます。
docker run --entrypoint SleepVER2 sleeper 20
--entrypointについては以下のページを参考にしてください。
https://docs.docker.com/engine/reference/run/#entrypoint-default-command-to-execute-at-runtime