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

时间:2017-04-26 23:37:09

标签: linux bash mongodb shell docker

我正在尝试在我的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"

3 个答案:

答案 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 mongomongo和{{--eval的可执行文件'rs.isMaster()' 1}}。