我对以下命令有点困惑:
kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run -- /bin/sh -c 'echo hello;sleep 3600'
YAML:
->YAML:
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)和命令(EntryPoint)都将使用在kubectl命令中指定的命令覆盖,因此它将类似于上面的形式:
/bin/sh -c 'echo hello;sleep 3600'
因此最终结果是相同的。
args
,那么将会使用 Docker 镜像中定义的默认Entrypoint
并搭配你所提供的args
来运行容器。此前提醒一下,你的最后一个声明可能被误解(Kubernetes 的command
与 Docker 的Cmd
)。 - Chris H.