kubectl run --command vs -- arguments

28

我对以下命令有点困惑:

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'

因此最终结果是相同的。

3个回答

55
在Kubernetes中使用容器时,应该注意不要混淆Kubernetes的command和Docker的Cmd
  • Kubernetes中的command字段对应于Docker中的EntryPoint字段。
  • Kubernetes中的args字段对应于Docker中的Cmd字段。
来自Kubernetes文档
当您覆盖默认的EntrypointCmd时,以下规则适用:
  • 如果未为容器提供commandargs,则使用在Docker映像中定义的默认值。
  • 如果为容器提供了command但没有提供args,则仅使用所提供的command。忽略了在Docker映像中定义的默认EntryPoint和默认Cmd
  • 如果只为容器提供args,则使用在Docker映像中定义的默认Entrypoint与您提供的args一起运行。
  • 如果为容器提供了commandargs,则忽略Docker映像中定义的默认EntryPoint和默认Cmd,使用您提供的command与您提供的args一起运行。

9

若要从命令行修改命令和参数,请使用以下命令:

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)

6
在这个例子中,两者是相同的。假设一个入口点(命令)被设置为sleep 1000,但如果您的args被设置为sleep 3000,则容器命令将被忽略,sleep 3000 将被执行。
如果存在args,则args优先于command,并覆盖command值。

3
如果你只提供容器的 args,那么将会使用 Docker 镜像中定义的默认 Entrypoint 并搭配你所提供的 args 来运行容器。此前提醒一下,你的最后一个声明可能被误解(Kubernetes 的 command 与 Docker 的 Cmd)。 - Chris H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接