从bash提示和脚本将参数传递给docker exec

cur*_*eer 6 linux bash shell mongodb docker

我正在尝试在我的mongodb docker容器内执行命令。从我的linux命令提示符下,这非常简单并且可以在执行此操作时使用

docker exec -it d886e775dfad mongo --eval 'rs.isMaster()'
Run Code Online (Sandbox Code Playgroud)

上面告诉我去一个容器并执行命令

"mongo --eval 'rs.isMaster()' - This tells mongo to take rs.isMaster() as an input and execute it. This works and gives me the output.
Run Code Online (Sandbox Code Playgroud)

由于我试图通过bash脚本自动执行此操作,因此我这样做了

cmd="mongo --eval 'rs.isMaster()"
Run Code Online (Sandbox Code Playgroud)

然后尝试像这样执行

docker -H $node2 exec d886e775dfad "$cmd"
Run Code Online (Sandbox Code Playgroud)

但我想码头工人以某种方式认为现在容器内的二进制文件不是mongo或其他东西,它给了我以下错误:

rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"mongo --eval 'rs.isMaster()'\": executable file not found in $PATH"
Run Code Online (Sandbox Code Playgroud)

小智 7

docker exec -it d886e775dfad sh -c "mongo --eval 'rs.isMaster()'"
Run Code Online (Sandbox Code Playgroud)

这将调用sh执行脚本的shell()用引号引起来。请注意,这还可以修复通配符(*)之类的问题,否则它们将无法在docker exec上正常使用。

  • 你能解释为什么你的解决方案能提高你贡献的价值吗?仅发布代码通常不是很有帮助。 (2认同)

How*_*ard 0

看起来 mongo 正在将 的全部内容解释$cmd为要执行的命令。这是有道理的,因为您在命令行上引用了该参数。本质上,当您执行... exec "$cmd"此操作时,外壳将解释美元符号并将其扩展为就地内容。接下来,它将解释双引号并传递整个内部内容(现在作为mongo --eval 'rs.isMaster()'进程的单个命令行参数。这应该导致 mongo 寻找mongo --eval 'rs.isMaster()路径中具有该名称的程序。这显然不存在。