在 kubectl 中设置命令时,'-- /bin/sh -c ls' 与 'ls' 之间的区别?

Difference between '-- /bin/sh -c ls' vs 'ls' when setting a command in kubectl?

我对 kubectl 中的命令有点困惑。我不确定什么时候可以直接使用

这样的命令

command: ["command"] or -- some_command

command: [/bin/sh, -c, "command"] or -- /bin/sh -c some_command

I am bit confused with commands in kubectl. I am not sure when I can use the commands directly

谢天谢地,区别很简单(?):每个 command: 都被送入 exec system call(或其等效的 golang);所以如果你的容器包含内核可以成功执行的二进制文件,欢迎你在command:中使用它;如果它是 shell 内置的,shell 别名,或者需要 sh(或 python 或其他)来执行,那么您必须对容器运行时明确关于那个区别

如果有帮助,kubernetes container:s 的 command: 语法是 Dockerfile ENTRYPOINT ["",""] 行的 等效 ,而不是 CMD ["", ""] 肯定不会 ENTRYPOINT echo this is fed to /bin/sh for you.

在低级别,每个 (Unix/Linux) 命令都作为一系列“单词”调用。如果您在 shell 中键入命令,shell 会进行一些预处理,然后创建“单词”并运行命令。在 Kubernetes command:(和 args:)中不涉及 shell,除非您明确提供一个。

除非您特别需要 shell 功能,否则我会默认使用列表形式。

command: # overrides Docker ENTRYPOINT
  - the_command
  - --an-argument
  - --another
  - value

如果使用列表形式,则必须明确列出每个单词。您可以使用上面的 YAML 阻止列表语法或流列表语法 [command, arg1, arg2]。如果单个项目中有嵌入的空格 [command, --option value],那么这些空格将包含在单个命令行选项中,就像您引用它一样,这经常会混淆程序。

如果需要,您可以显式调用 shell:

command:
  - sh
  - -c
  - the_command --an-argument --another value

这条命令就三个字,sh,选项-c,shell命令。 shell 将以通常的方式处理此命令并执行它。

只有当您做的事情比 运行 具有固定参数的简单命令更复杂时,您才需要 shell 形式。 运行 多个顺序命令 c1 && c2 或环境变量扩展 c1 "$OPTION" 可能是最常见的,但任何标准 Bourne shell 语法在这里都是可以接受的(重定向、管道、.. .).