はじめに
Kubernetes
でPod
をデプロイする際、
コンテナの起動コマンドを制御するためにcommand
やargs
を指定することがあります。
例えば、以下のようなDockerfile
とmanifest
ファイルがあるとします。
FROM alpine:latest
ENTRYPOINT ["echo", "hello"]
CMD ["world"]
apiVersion: v1
kind: Pod
metadata:
name: echo
spec:
containers:
- name: echo
image: echo:latest
imagePullPolicy: Never
command: ["echo", "1"]
args: ["2"]
manifest
で指定したcommnad
とargs
は、
DockerfileのENTRYPOINT
やCMD
とどのように関係しているのでしょうか。
本記事では、その挙動について解説します。
DockerfileでのCMDとENTRYPOINT
以下のDockerfileを例に挙動を見てみます
FROM alpine:latest
ENTRYPOINT ["echo", "hello"]
CMD ["world"]
このDockerfile
からimageを作成し、実行してみます
$ docker build -t echo .
$ docker run -it --rm echo
hello world
hello world
と出力されました。
つまり、ENTRYPOINT
の実行コマンドにCMD
が引数として渡されて実行されます
ENTRYPOINT
だけ、CMD
だけの時にどうなるかは、リファレンスを参照してみてください
(本題) k8sでのcommnadとargsの挙動について
さて、本題ですが、
KubernetesのPodについてのドキュメントに以下のように書いてありました。
Note:
The command field corresponds to ENTRYPOINT, and the args field corresponds to CMD in some container runtimes.
つまり、command
を指定すると、ENTRYPONIT
が上書かれ、args
を指定すると、CMD
を上書きすることができます。
最初の例を見てみましょう。
FROM alpine:latest
ENTRYPOINT ["echo", "hello"]
CMD ["world"]
apiVersion: v1
kind: Pod
metadata:
name: echo
spec:
containers:
- name: echo
image: echo:latest
imagePullPolicy: Never
command: ["echo", "1"]
args: ["2"]
上書きが起きるとすると、
ENTRYPOINT: echo hello
-> echo 1
CMD: world
-> echo 2
となるので、echo 1 2
が実行されるのでしょうか。
実行してみます。
$ kubectl apply -f manifest.yaml
$ kubectl logs echo
1 2
予想が当たり、1 2
が出力されましたね
まとめ
まとめです。
Dockerfile | Kubernetes | 実際に実行されるもの |
---|---|---|
ENTRYPOINT | command | command が優先(ENTRYPOINTを置き換える) |
CMD | args | args が優先(CMDを置き換える) |
CMD
とcommand
が同じじゃ無いんですね〜
サンプルコード
参考