从Bash提示符和脚本传递参数给Docker exec

14

我正在尝试在我的 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认为容器内的二进制文件现在不是MongoDB或其他内容,因此它会给我以下错误:

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个回答

27
docker exec -it d886e775dfad sh -c "mongo --eval 'rs.isMaster()'"

这将调用 shell (sh) 来执行带引号的脚本。请注意,这还会修复诸如通配符 (*) 等在使用 docker exec 时无法正常工作的问题。


2
你能解释一下为什么你的解决方案有效吗?这样可以提高你的贡献价值。仅发布代码通常并不是很有帮助。 - Noel Widmer
为什么 docker exec --help 中没有列出 -c 选项? - undefined
@Caleb 这是对 sh 的一个参数 - undefined
哦!太酷了。谢谢! - undefined

4

你需要运行以下命令(你的示例中缺少单引号):

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

跟着(不需要引号包围$cmd)执行以下命令:
docker -H $node2 exec d886e775dfad $cmd

通过在$cmd周围加上引号,您正在寻找可执行文件mongo --eval 'rs.isMaster()',而不是带有参数mongo--eval'rs.isMaster()'的可执行文件mongo


0

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


我该如何修复这个问题? - curiousengineer
抱歉,我忘记了解决方案。尝试省略变量周围的引号。然后它应该内联扩展变量,并变成docker -H $node2 exec d886e775dfad mongo --eval 'rs.isMaster()' - Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接