首页 > 解决方案 > kubectl run --command vs -- arguments

问题描述

我对以下命令有点困惑:

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 将用作入口点命令。因此,将在 docker 映像中执行的结果命令将是Docker EntryPoint + kubectl arguments.

由于 Busybox DockerFile 不包含任何入口点(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'

所以最终会是一样的。

标签: kubernetesargumentscommandkubectlbusybox

解决方案


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

  • commandKubernetes 中的字段对应 Docker 中的EntryPoint字段
  • argsKubernetes 中的字段对应 Docker 中的Cmd字段

来自Kubernetes 文档

当您覆盖默认值EntrypointandCmd时,这些规则适用:

  • 如果您不提供Container,commandargs使用 Docker 映像中定义的默认值。

  • 如果您为 Container 提供 a commandbut no ,则仅使用提供的。默认值和Docker 镜像中定义的默认值被忽略。argscommandEntryPointCmd

  • 如果您只args为 Container 提供,Entrypoint 则 Docker 映像中定义的默认值将使用args您提供的内容运行。

  • 如果您提供commandand args,则忽略 Docker 映像中定义的默认值Entrypoint和默认值。Cmdcommand是用你的args.


推荐阅读