【问题标题】:kubectl run --command vs -- argumentskubectl run --command vs -- arguments
【发布时间】:2020-04-02 12:33:50
【问题描述】:

我对下面的命令有点困惑:

kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run -- /bin/sh -c 'echo hello;sleep 3600'

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 arguments(CMD) 和 command(EntryPoint) 都将被 kubectl 命令中指定的命令覆盖,所以它看起来类似于上面:

/bin/sh -c 'echo hello;sleep 3600'

所以最后还是一样的。

【问题讨论】:

    标签: kubernetes arguments command kubectl busybox


    【解决方案1】:

    在 Kubernetes 中使用容器时,应注意不要混淆 Kubenetes command 和 Docker Cmd

    • Kubernetes 中的 command 字段对应 Docker 中的 EntryPoint 字段
    • Kubernetes 中的 args 字段对应 Docker 中的 Cmd 字段

    来自Kubernets documentation

    当您覆盖默认的 EntrypointCmd 时,这些规则适用:

    • 如果您不为容器提供 commandargs,则默认值 使用 Docker 镜像中定义的。

    • 如果您为容器提供 command 但没有 args,则仅提供 使用command。默认的EntryPoint 和默认的Cmd 定义在 Docker 镜像被忽略。

    • 如果您只为容器提供args,则默认为Entrypoint 在 Docker 映像中定义的代码使用您提供的 args 运行。

    • 如果您提供 commandargs,则默认的 Entrypoint 和 Docker 映像中定义的默认 Cmd 将被忽略。您的command 是 使用您的args 运行。

    【讨论】:

      【解决方案2】:

      在这个例子中,是的,两者都是一样的。 假设入口点(命令)设置为sleep 1000,但如果您的参数设置为sleep 3000,则容器命令将被忽略并执行sleep 3000

      args 优先于命令,如果 args 存在则覆盖命令值

      【讨论】:

      • 您最后的陈述可能会被误解(Kubernetes command vs Docker Cmd)。 --> 如果您只为容器提供args,则Docker 映像中定义的默认Entrypoint 将使用您提供的args 运行。
      猜你喜欢
      • 2018-05-02
      • 2018-10-06
      • 2018-06-14
      • 2022-12-26
      • 2010-11-19
      • 2016-06-06
      • 2021-10-30
      • 2021-09-17
      • 2016-09-30
      相关资源
      最近更新 更多