shell 对Kubernetes清单文件中命令语法的说明

bjg7j2ky  于 2022-12-23  发布在  Shell
关注(0)|答案(2)|浏览(144)

我正在处理一个问题,这个问题希望我使用nginx映像部署一个pod。这个pod应该休眠5000秒。
该命令可按如下方式指定:

command: ["sleep", "5000"]

或者类似的:

command:
  - sleep
  - "5000"

为什么不能这样指定命令:

command:
  - sh
  - -c
  - sleep "5000"

或者类似的:

command:
  - sleep "5000"

换句话说,我对两件事感到困惑:

  1. sh -c是做什么的?我知道-c是用来表示参数的,但是sleep命令不是使用sh运行的吗?
    1.什么时候命令和参数可以列在同一行,什么时候它们必须在单独的行?在这个例子中,为什么sleep "5000"不工作?为什么sleep"5000"必须在单独的行?还有,为什么需要在数字5000周围加上引号?
r55awzrz

r55awzrz1#

请注意,K8s对象定义或清单中的commandargs是容器映像定义中的面内entrypointcmd字段。这些字段应该以某种特定的方式运行。例如:如果您查看Docker映像是如何定义的,您会发现entrypointcmd是两个常用字段。
在K8s对象定义中提供command和/或args会覆盖关联容器的entrypointcmd字段。
例如,docker映像定义中的entrypoint既可以作为单个字符串(sleep 5000),也可以作为一个分解数组([“sleep”,“500”])。无论哪种方式,它最终都会分解为一个参数数组(即sleep 5000变为[“sleep”,“5000”])。

我想K8s试图通过让您仅以数组的形式提供它来简化这个过程

这个article是一个很好的参考资料,可以帮助您理解entrypointcmd如何在容器映像定义上联合工作。2这个行为感觉有点不必要的复杂,我不能更感谢K8s的贡献者,因为他们至少在某种程度上简化了它。

o8x7eapl

o8x7eapl2#

运行命令的两种方式:

command: ["sleep", "5000"]

与以下内容完全相同:

command:
 - sleep
 - 5000

在这两种情况下,它都被解释为一个列表,这是表达列表的两种方式。
无法将命令指定为command: sleep "5000",因为这将被解释为单个参数"sleep 5000",而不是两个单独的参数sleep5000
可以将其视为在shell中运行以下命令:

`"sleep 5000"`

这将作为单个命令运行,并且5000不会被解释为参数。command: [sleep, 5000]将被解释为:

`"sleep"` 5000
# or simply... (same as)
`sleep` "5000"

因此被正确地解释为睡眠的论点。
对于sh -csh调用程序sh(shell)作为解释器,而-c标志表示执行此程序解释的以下命令。-c是通知shell执行其后面的命令的标志。因此,在此方案中,使用sh -c是多余的,我不确定它是否能正确执行。

相关问题