我正在处理一个问题,这个问题希望我使用nginx
映像部署一个pod。这个pod应该休眠5000秒。
该命令可按如下方式指定:
command: ["sleep", "5000"]
或者类似的:
command:
- sleep
- "5000"
为什么不能这样指定命令:
command:
- sh
- -c
- sleep "5000"
或者类似的:
command:
- sleep "5000"
换句话说,我对两件事感到困惑:
sh -c
是做什么的?我知道-c
是用来表示参数的,但是sleep
命令不是使用sh
运行的吗?
1.什么时候命令和参数可以列在同一行,什么时候它们必须在单独的行?在这个例子中,为什么sleep "5000"
不工作?为什么sleep
和"5000"
必须在单独的行?还有,为什么需要在数字5000周围加上引号?
2条答案
按热度按时间r55awzrz1#
请注意,K8s对象定义或清单中的
command
和args
是容器映像定义中的面内entrypoint
和cmd
字段。这些字段应该以某种特定的方式运行。例如:如果您查看Docker映像是如何定义的,您会发现entrypoint
和cmd
是两个常用字段。在K8s对象定义中提供
command
和/或args
会覆盖关联容器的entrypoint
和cmd
字段。例如,docker映像定义中的
entrypoint
既可以作为单个字符串(sleep 5000
),也可以作为一个分解数组([“sleep”,“500”])。无论哪种方式,它最终都会分解为一个参数数组(即sleep 5000
变为[“sleep”,“5000”])。我想K8s试图通过让您仅以数组的形式提供它来简化这个过程。
这个article是一个很好的参考资料,可以帮助您理解
entrypoint
和cmd
如何在容器映像定义上联合工作。2这个行为感觉有点不必要的复杂,我不能更感谢K8s的贡献者,因为他们至少在某种程度上简化了它。o8x7eapl2#
运行命令的两种方式:
与以下内容完全相同:
在这两种情况下,它都被解释为一个列表,这是表达列表的两种方式。
无法将命令指定为
command: sleep "5000"
,因为这将被解释为单个参数"sleep 5000"
,而不是两个单独的参数sleep
和5000
。可以将其视为在shell中运行以下命令:
这将作为单个命令运行,并且
5000
不会被解释为参数。command: [sleep, 5000]
将被解释为:因此被正确地解释为睡眠的论点。
对于
sh -c
,sh
调用程序sh
(shell)作为解释器,而-c
标志表示执行此程序解释的以下命令。-c
是通知shell执行其后面的命令的标志。因此,在此方案中,使用sh -c
是多余的,我不确定它是否能正确执行。