我对以下命令有点困惑:
kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run -- /bin/sh -c 'echo hello;sleep 3600'
亚姆:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybox
name: busybox
spec:
containers:
- args:
- /bin/sh
- -c
- echo hello;sleep 3600
image: busybox
name: busybox
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
我知道如果我们不指定参数--command
,那么--
之后的参数将被视为参数。
但我想知道,/bin/sh -c "echo hello;sleep 3600"
在发生争执时是如何工作的?根据 Kubernetes 文档(https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes(,如果我们只在 POD 中指定参数,那么 docker EntryPoint 将用作 EntryPoint 命令。因此,将在 docker 映像中执行的结果命令将Docker EntryPoint + kubectl arguments
。
由于 Busybox DockerFile 不包含任何 EntryPoint(https://github.com/docker-library/busybox/blob/master/musl/Dockerfile(,因此只会使用 kubectl 命令中指定的参数,因此该命令将如下所示:
/bin/sh -c 'echo hello;sleep 3600'
如果我们指定--command
,那么根据 Kubernetes 文档,DockerFile 参数(CMD( 和 command(EntryPoint( 都将被 kubectl 命令中指定的命令覆盖,因此它看起来类似于上面:
/bin/sh -c 'echo hello;sleep 3600'
所以最后会是一样的。
在 Kubernetes 中使用容器时,应该注意不要混淆 Kubenetescommand
和 DockerCmd
。
- Kubernetes 中的
command
字段对应于 Docker 中的EntryPoint
字段 - Kubernetes 中的
args
字段对应于 Docker 中的Cmd
字段
来自 Kubernets 文档:
覆盖默认
Entrypoint
和Cmd
时,以下规则适用:
如果不为容器提供
command
或args
,则默认值 使用在 Docker 映像中定义的。如果您为容器提供
command
但没有args
,则仅提供 使用command
。默认EntryPoint
和默认Cmd
中定义 Docker 映像将被忽略。如果仅为容器提供
args
,则默认Entrypoint
在 Docker 映像中定义将使用您提供的args
运行。如果提供
command
和args
,则默认Entrypoint
和 Docker 映像中定义的默认Cmd
将被忽略。您的command
是 用你的args
运行。
要从命令行修改命令和参数,请使用以下命令:
kubectl run nginx --image=nginx --command -- sleep 1000
另一个相同的示例:
kubectl run nginx --image=nginx --command -- python myapp.py
如果您只想覆盖参数(而不是命令本身(,它将是:
kubectl run nginx --image=nginx -- 1000 #(sending the 1000 seconds to
sleep)
在此示例中,是的,两者都是相同的。 假设入口点(命令(设置为sleep 1000
但是如果您的 args 设置为sleep 3000
则容器命令将被忽略并执行sleep 3000
。
Args 优先于命令,如果 args 存在,则覆盖命令值