【问题标题】:Difference between '-- /bin/sh -c ls' vs 'ls' when setting a command in kubectl?在 kubectl 中设置命令时,'-- /bin/sh -c ls' 与 'ls' 的区别?
【发布时间】: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


    【解决方案1】:

    我对 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

    【讨论】:

      【解决方案2】:

      在底层,每个(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 语法(重定向、管道等)。

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 2021-11-08
        • 1970-01-01
        • 2023-02-07
        • 2016-07-25
        • 2014-05-30
        • 2017-04-09
        • 1970-01-01
        • 2012-11-13
        相关资源
        最近更新 更多