在 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 语法在这里都是可以接受的(重定向、管道、.. .).
我对 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 语法在这里都是可以接受的(重定向、管道、.. .).