如何在Bash脚本中向Docker容器传递参数并执行命令?
问题描述
我编写了一个具备命令行执行功能的Bash脚本,目标是让它在Docker容器内运行指定命令、传递参数后自动退出,但始终无法实现参数传递。手动执行的Docker命令流程如下:
$ docker exec -it rti_cmd root@29c:/data# rti 187.0.0.1:9806> run_cmd (integer) 0 187.0.0.1:9806> exit root@29c:/data# exit exit
我尝试了两种脚本写法:
#!/bin/bash docker exec -it rti_cmd bash<< eeee rti run_cmd exit exit eeee #也尝试过不使用";"的写法 docker exec -it rti_cmd bash /bin/sh -c "rti; run_cmd; exit; exit"
执行脚本时出现以下错误:
$ chmod +x test.sh $ ./test.sh the input device is not a TTY /bin/sh: /bin/sh: cannot execute binary file ./test.sh: line 17: $'rti;\nrun_cmd;\nexit;\nexit': command not found
问题分析与解决方案
核心问题拆解
-it参数冲突:脚本以非交互式方式运行时,docker exec的-it参数会强制要求TTY终端,直接触发the input device is not a TTY错误,需移除该参数。- 第二种写法语法错误:
bash /bin/sh -c属于重复调用shell,且命令字符串未与-c紧密衔接,导致shell将单独的字符串识别为新命令,引发找不到命令的报错。 - 交互式命令
rti的处理:rti是交互式CLI工具,需通过管道或Here Document向其传递命令,无需额外手动执行exit退出容器shell(命令执行完毕后shell会自动退出)。
修正后的脚本示例
方法一:管道传递命令
#!/bin/bash docker exec rti_cmd bash -c "echo -e 'run_cmd\nexit' | rti"
方法二:Here Document 方式
#!/bin/bash docker exec rti_cmd bash << 'EOF' echo -e 'run_cmd\nexit' | rti EOF
传递参数给 run_cmd
若需向 run_cmd 传递参数,直接在命令中拼接即可:
#!/bin/bash PARAM1="your_arg1" PARAM2="your_arg2" docker exec rti_cmd bash -c "echo -e 'run_cmd $PARAM1 $PARAM2\nexit' | rti"
执行修正后的脚本即可完成命令自动执行并退出容器,无报错。
内容的提问来源于stack exchange,提问作者hqp
相关产品推荐
相关产品推荐

