在k8 pod中运行bash脚本时,Command: []string{"sh", "-c", "scripts/start-script.sh"}和Command: []string{"sh", "scripts/start-script.sh"}有什么区别?他们做同样的事情吗?哪个更好?
Command: []string{"sh", "-c", "scripts/start-script.sh"}
Command: []string{"sh", "scripts/start-script.sh"}
fnatzsnv1#
你根本不需要提到sh。
sh
Command: []string{"scripts/start-script.sh"},
字符串这听起来像是在容器中启动默认主进程的正常做法。如果您的镜像的Dockerfile已经将其作为CMD或ENTRYPOINT,那么您不需要在Pod规范中指定Command:。sh -c表单启动一个shell,让该shell解释字符串scripts/start-script.sh,然后运行它。这可能会导致额外的进程,并且如果您没有完全控制命令字符串,可能会出现严重的安全问题(*shell注入 * 攻击)。如果需要将环境变量注入到命令行中,使用重定向或管道等功能(在Job spec中可能更有可能),或者运行多个命令(顺序),那么您需要sh -c。sh表单明确指定您需要使用系统Bourne shell来运行脚本。如果脚本不是POSIX shell脚本--它使用来自GNU bash的特性,它实际上是在Python中--这将不起作用。在正常使用中,脚本应该是可执行的,并且它的第一行应该是“shebang”行#!/bin/sh或类似行。这告诉系统使用哪个解释器来执行它。使用标准设置,您不需要在命令行中包含解释器名称。
CMD
ENTRYPOINT
Command:
sh -c
scripts/start-script.sh
#!/bin/sh
jmo0nnb32#
嘿,不,他们不会做同样的事情。使用命令sh,你说你想运行shell,它是一个输入/输出CLI工具。“-c”这是shell命令的一个选项。它指示后面的参数应该被解释为要由shell执行的命令或脚本。如果你不指定-c,shell就不知道该怎么处理你的后面的参数。在您的情况下,请使用脚本/start-script.sh
2条答案
按热度按时间fnatzsnv1#
你根本不需要提到
sh
。字符串
这听起来像是在容器中启动默认主进程的正常做法。如果您的镜像的Dockerfile已经将其作为
CMD
或ENTRYPOINT
,那么您不需要在Pod规范中指定Command:
。sh -c
表单启动一个shell,让该shell解释字符串scripts/start-script.sh
,然后运行它。这可能会导致额外的进程,并且如果您没有完全控制命令字符串,可能会出现严重的安全问题(*shell注入 * 攻击)。如果需要将环境变量注入到命令行中,使用重定向或管道等功能(在Job spec中可能更有可能),或者运行多个命令(顺序),那么您需要sh -c
。sh
表单明确指定您需要使用系统Bourne shell来运行脚本。如果脚本不是POSIX shell脚本--它使用来自GNU bash的特性,它实际上是在Python中--这将不起作用。在正常使用中,脚本应该是可执行的,并且它的第一行应该是“shebang”行
#!/bin/sh
或类似行。这告诉系统使用哪个解释器来执行它。使用标准设置,您不需要在命令行中包含解释器名称。jmo0nnb32#
嘿,不,他们不会做同样的事情。使用命令sh,你说你想运行shell,它是一个输入/输出CLI工具。
“-c”这是shell命令的一个选项。它指示后面的参数应该被解释为要由shell执行的命令或脚本。
如果你不指定-c,shell就不知道该怎么处理你的后面的参数。在您的情况下,请使用脚本/start-script.sh