Kubernetes中的多个mongo命令不起作用

时间:2018-08-21 20:56:14

标签: mongodb bash kubernetes

我正在尝试自动执行以下一系列可以在BASH脚本中正常运行的命令:

kubectl exec -it mongo-pod -- bash
mongo DBNAME
db.auth("theUser", "thePw")
db.theCollection.find()

我正在使用的脚本如下:

#!/bin/bash

kubectl exec -it mongo-pod -- bash -c "mongo DBNAME && /
db.auth("theUser", "thePw") && /
db.theCollection.find()"

我尝试了以下方法: Executing multiple commands( or from a shell script) in a kubernetes pod 但是在第一次使用&或&&之后添加的任何命令都不会执行。例如,仅使用“ mongo DBNAME”可以正确打开提示并将其设置为正确的数据库,但是使用&&添加任何其他命令会导致所有命令失败,并显示以下内容:

bash:-c行0:意外令牌'theUser'附近的语法错误

1 个答案:

答案 0 :(得分:0)

所有评论都应有尽有,但至少有两件我最有信心的答案:

首先,您将换行符设置为错误;应该是\,而不是/。实际上,如果您使用b

将bash切换为“错误退出”模式,甚至甚至不需要
kubectl exec -it mongo-pod -- bash -ec "mongo DBNAME
echo 'this command only runs if mongo exits a-ok'
exit 1
and this never will run
"

但是,另一个错误是使用引号引起的:如果您使用bash -c ",则必须对内部字符串文字使用单引号,或者使用\"对其进行转义。通过查看问题中shell片段的语法突出显示,您实际上可以看到我在说什么。观察到字符串文字是红色的,但随后的文本theUserthePw都是黑色的-这是因为它们在字符串文字之外,因为字符串在第一个"处停止了它遇到了-db.auth("

中存在的一个

在大多数情况下,这样远程远程调用bash时,您总是要使用单引号,这是出于几种原因,但最相关的是您可以使用db.auth("something")不必不必要地转义双引号。

由于mongo(像许多解释器,例如nodepython)希望您以交互方式键入它,在其“标准输入”上提供输入,或者给它一个包含命令的本地文件,您将需要根据需要将调用更改为这些策略之一。

一种无需使用echoprintf及其相关的引号地狱而重定向标准输入的非常方便的方法是在bash中使用所谓的"here documents" (abbreviated "heredocs")

kubectl exec -it mongo-pod -- bash -ec 'mongo DBNAME<<"FOO"
db.auth("theUser", "thePw")
printjson(db.theCollection.find())
FOO
'

这导致bash将两个“ heredoc定界符”之间的几乎所有字符都传输到命令的标准输入。如果像我用[任意]词FOO那样引用定界符,则内容将不受变量扩展,命令插值等的影响,这可以成为避免反引号和美元风格怪异的另一种机制。 / p>