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