您可以在没有bash -c的情况下将环境变量传递给kubectl exec吗?

时间:2019-04-28 20:33:49

标签: bash kubernetes kubectl

我在名为script01的pod中有一个脚本,它可以接受参数。 我通过以下命令运行脚本:

POD=<pod name>
runScript="kubectl -n nmspc exec $POD -- script01"
$runScript --command "do stuff"

我以这种方式运行它的原因是,我无权在本地计算机上创建脚本,但是我有权访问pod上的脚本。

问题是我想将主机的IP传递给Pod,并希望使用环境变量来完成。我尝试使用bash -c传递参数,但是通过变量调用脚本时,它不会附加参数。

runScript="kubectl -n nmspc exec $POD -- bash -c \"export curIP=123 && script01\""

但是如果我用 $runScript --command "do stuff"

如何将环境变量传递到Pod,但仍然可以通过该变量调用脚本?

2 个答案:

答案 0 :(得分:7)

/usr/bin/envkey=value对中传递的值导出到它用来调用的任何程序的环境中。

kubectl -n nmspc exec "$POD" -- env curIP=123 script01

请注意,您切勿使用$runScript或任何其他未引用的扩展名来调用Shell命令。请参见BashFAQ #50-我正在尝试将命令放入变量中,但是复杂的情况总是会失败!


作为一个示例,您可以 bash -c保留在适当的位置,但可以执行命令,请考虑:

runScript() {
  kubectl -n nmspc exec "$POD" -- bash -c 'export curIP=123 && script01 "$@"' _ "$@"
}

runScript --command "do stuff"

在这里,runScript是一个函数,而不是字符串变量,它显式地将其整个参数列表传递给kubectl。同样,由bash开始的kubectl的副本将参数列表(在$0占位符_之后)显式传递到{{1} },因此最终结果是您的参数使之进入最终程序。

答案 1 :(得分:0)

只需使用sh:

kubectl -n nmspc exec "$POD" -- /bin/sh -c 'curIP=123 script01'