DockerfileでENTRYPOINT、CMDの挙動を動かしながら理解する
はじめに
Dockerfile内で指定可能なコマンドはいくつかありますが、 ENTRYPOINT コマンドと CMD コマンドは初見ではわかりくいコマンドとなっています。
この2つのコマンドが、Dockerコンテナの実行にどのように影響するか、実行させながら理解していきたいと思います。
検証環境
Dockerイメージ実行時の実行コマンドの組み立てロジック
今回は結論から入ります。
Dockerイメージ内で実行されるコマンド は、以下の3つの要素を使って組み立てられます。
- Dockerfile内の ENTRYPOINTの設定値
docker run IMAGE_NAME
コマンド実行時の コマンドライン引数- Dockerfile内の CMDの設定値
2と3の両方が設定されている場合は、 2が優先され、3は無視 されます。
結果、 Dockerイメージ内で実行されるコマンド は以下のようになります。
具体的な例を見ていきたいと思います。
Dockerfileに ENTRYPOINT と CMD の両方が指定されている場合
ENTRYPOINT と CMD の両方が指定されたDockerfileから、Dockerイメージを作成してみます。
Dockerイメージを実行 (コマンドライン引数なし)
まずは作成されたDockerイメージを、イメージ名の後方に引数をつけずに実行してみます。
<ENTRYPOINTの設定値> <コマンドライン引数|CMDの設定値>
という実行コマンド組み立てルールから、 seq 1 5
が実行されています。
Dockerイメージを実行 (コマンドライン引数あり)
今度はイメージ名の後方に引数を付与して実行してみます。
<ENTRYPOINTの設定値> <コマンドライン引数|CMDの設定値>
という実行コマンド組み立てルールから、 seq 2 4
が実行されています。
コマンドライン引数 のほうが優先され、 CMDの設定値 は無視されました。
Dockerfileに ENTRYPOINT だけが指定されている場合
ENTRYPOINT だけが指定されたDockerfileから、Dockerイメージを作成してみます。
Dockerイメージを実行 (コマンドライン引数なし)
<ENTRYPOINTの設定値> <コマンドライン引数|CMDの設定値>
という実行コマンド組み立てルールから、 seq
が引数無しで実行されます。
seqコマンドは引数が必須のため、エラーが発生したというわけです。
Dockerイメージを実行 (コマンドライン引数あり)
今度はイメージ名の後方に引数を付与して実行してみます。
<ENTRYPOINTの設定値> <コマンドライン引数|CMDの設定値>
という実行コマンド組み立てルールから、 seq 2 3
が実行されています。
Dockerfileに CMD だけが指定されている場合
CMD だけが指定されたDockerfileから、Dockerイメージを作成してみます。
ただし、今回は先程のCMDの設定とは異なる値としています。
Dockerイメージを実行 (コマンドライン引数なし)
<ENTRYPOINTの設定値> <コマンドライン引数|CMDの設定値>
という実行コマンド組み立てルールから、 seq 1 5
が実行されています。
ENTRYPOINTの設定値 が空なので、 CMDの設定値 だけで実行コマンドが組み立てられました。
Dockerイメージを実行 (コマンドライン引数あり)
コマンドライン引数を付与して実行してみますが、こちらも先程までと少し異なっている点に注意しましょう。( seq
の文字が含まれています。 )
<ENTRYPOINTの設定値> <コマンドライン引数|CMDの設定値>
という実行コマンド組み立てルールから、 seq 2 3
が実行されています。
やはり ENTRYPOINTの設定値 が空なので、 コマンドライン引数 だけで実行コマンドが組み立てられました。
ひとこと
この仕組みは、 Docker Compose や Kubernetes の設定時にも理解しておく必要があります。
ディスカッション
コメント一覧
まだ、コメントがありません