You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:54:18