【问题标题】:Can you pass an environment variables into kubectl exec without bash -c?你可以在没有 bash -c 的情况下将环境变量传递给 kubectl exec 吗?
【发布时间】:2019-09-17 13:06:53
【问题描述】:

我在一个名为 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,但仍然可以通过变量调用脚本?

【问题讨论】:

  • 解释您的参数发生的部分情况——bash -c '...'... 解释为要运行的整个脚本。在该 ... 脚本的上下文中,该参数之后的任何参数都会变为 $0$1 等——但如果脚本从不读取这些参数,它们就会被忽略。
  • 您可能会认为Job 是一种更可靠的方式,可以让某些命令在集群中的某个位置运行。我会尝试保留kubectl exec 进行调试。

标签: bash kubernetes kubectl


【解决方案1】:

/usr/bin/env 将以 key=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。同样,由kubectl 开始的bash 的副本显式地将its 参数列表(在$0 占位符_ 之后)传递给script01,所以最终结果是你的参数一直到你的最终程序。

【讨论】:

  • 谢谢,查尔斯。我已经阅读了您发布的链接,但鉴于我的情况,我不得不通过它。根据我的情况,您提供的解决方案非常有效。
【解决方案2】:

只需使用 sh:

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

【讨论】:

  • @CharlesDuffy 确切地说我忘记了参数周围的引号,修复了它
  • 好多了——现在确实应该可以了。也就是说,您使用sh 的方式等同于/usr/bin/env curIP=123 script01;可以说,通过使用较小的工具可以加快一点速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多