LoginSignup
2
0

More than 3 years have passed since last update.

Docker CMDとEntrypointの違い

Posted at

はじめに

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

2
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
2
0