我正在尝试在我的mongodb docker容器中执行命令。从我的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"
答案 0 :(得分:1)
docker exec -it d886e775dfad sh -c "mongo --eval 'rs.isMaster()'"
这将调用shell(sh
)以引号执行脚本。
请注意,这也修复了通配符(*)之类的问题,否则它们与docker exec无法正常工作。
答案 1 :(得分:0)
看起来mongo正在将$cmd
的全部内容解释为要执行的命令。这是有道理的,因为您在命令行上引用了参数。基本上当你执行... exec "$cmd"
时,shell将解释美元符号并将其扩展为就地内容。接下来,它将解释双引号并将整个内部内容(现在为mongo --eval 'rs.isMaster()'
)作为单个命令行参数传递给进程。这将导致mongo查找名为mongo --eval 'rs.isMaster()
的程序你的道路。显然不存在。
答案 2 :(得分:0)
您需要运行(示例中缺少单引号):
cmd="mongo --eval 'rs.isMaster()'"
后跟($cmd
周围没有引号):
docker -H $node2 exec d886e775dfad $cmd
通过在$cmd
周围添加引号,您正在寻找可执行文件mongo --eval 'rs.isMaster()'
而不是带有args mongo
,mongo
和{{--eval
的可执行文件'rs.isMaster()'
1}}。