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

我想在我的MongoDB泊坞窗容器内执行一个命令。 从我的Linux命令提示符,这是很容易的,当我这样做的工作

docker exec -it d886e775dfad mongo --eval 'rs.isMaster()' 

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

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

由于我试图通过bash脚本自动化,我做到了

 cmd="mongo --eval 'rs.isMaster()" 

然后尝试像这样执行

 docker -H $node2 exec d886e775dfad "$cmd" 

但我想不知怎么,docker认为,现在容器内的二进制文件是不是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" 

看起来mongo正在将$cmd的全部内容解释为要执行的命令。 这是有道理的,因为你是在命令行上引用参数。 基本上,当你做... exec "$cmd"的shell将解释美元符号,并扩大到原地的内容。 接下来,它将解释双引号,并将整个内部的内容(现在是mongo --eval 'rs.isMaster()'作为单个命令行parameter passing给进程,这将导致mongo查找名称为mongo --eval 'rs.isMaster()在你的path中,显然不存在。

你需要运行(在你的例子中有一个缺less的单引号):

 cmd="mongo --eval 'rs.isMaster()'" 

紧接着(没有引用$cmd左右):

 docker -H $node2 exec d886e775dfad $cmd 

通过在$cmd周围$cmd引号,你正在寻找可执行文件mongo --eval 'rs.isMaster()'而不是mongo的可执行文件mongo ,– --eval'rs.isMaster()'

docker exec -it d886e775dfad sh -c“mongo –eval'rs.isMaster()'”这个调用shell(sh)在语音标记中执行脚本。 请注意,这也修复了通配符(*),否则不能正确使用docker exec。