kubectl run --command vs -- arguments

Ami*_*kar 6 command arguments busybox kubernetes kubectl

我对以下命令有点困惑:

kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run -- /bin/sh -c 'echo hello;sleep 3600'
Run Code Online (Sandbox Code Playgroud)

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: {}
Run Code Online (Sandbox Code Playgroud)

我知道如果我们不指定 parameter --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 不包含任何 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'

所以最终会是一样的。

小智 11

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

kubectl run nginx --image=nginx --command -- sleep 1000
Run Code Online (Sandbox Code Playgroud)

另一个相同的例子:

kubectl run nginx --image=nginx --command -- python myapp.py
Run Code Online (Sandbox Code Playgroud)

如果您只想覆盖一个参数(而不是命令本身),则为:

kubectl run nginx --image=nginx -- 1000    #(sending the 1000 seconds to 
sleep)
Run Code Online (Sandbox Code Playgroud)


Chr*_* H. 7

在 Kubernetes 中使用容器时,您应该小心不要混淆 Kubenetescommand和 Docker Cmd

  • command在Kubernetes字段对应于EntryPoint在多克尔场
  • args在Kubernetes字段对应于Cmd在多克尔场

来自Kubernets 文档

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

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

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

  • 如果您只args为一个 Container 提供,Entrypoint 则 Docker 镜像中定义的默认值将与args您提供的一起运行。

  • 如果您提供commandand args,则忽略 Docker 映像中定义的默认值Entrypoint和默认值Cmd。你command的运行与你的args.


小智 6

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

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

  • 您的最后一条语句可能会被误解(Kubernetes `command` 与 Docker `Cmd`)。--> 如果您仅为容器提供“args”,则 Docker 映像中定义的默认“Entrypoint”将使用您提供的“args”运行。 (3认同)