【发布时间】:2021-03-09 09:29:23
【问题描述】:
我对 kubectl 中的命令有点困惑。我不确定什么时候可以直接使用命令,比如
command: ["command"] or -- some_command
对
command: [/bin/sh, -c, "command"] or -- /bin/sh -c some_command
【问题讨论】:
标签: kubernetes command sh kubectl
我对 kubectl 中的命令有点困惑。我不确定什么时候可以直接使用命令,比如
command: ["command"] or -- some_command
对
command: [/bin/sh, -c, "command"] or -- /bin/sh -c some_command
【问题讨论】:
标签: kubernetes command sh kubectl
我对 kubectl 中的命令有点困惑。不知道什么时候可以直接使用命令
谢天谢地,区别很简单(?):每个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,除非您明确提供。
除非您特别需要外壳功能,否则我会默认使用列表形式。
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 语法(重定向、管道等)。
【讨论】: