如何在Docker容器中带参数运行本地主机脚本(无需复制文件)
在Docker容器中执行本地脚本并传递参数
不用把脚本复制到容器里也能实现需求,我给你两种实用的解决方案:
方法一:使用bash -s传递位置参数
这是最直接适配你需求的方式——利用bash的-s选项,它会让bash从标准输入读取脚本内容,同时把后续的参数作为位置变量($1、$2等)传递给脚本。
举个实际例子:
假设你的本地脚本mylocal.sh内容是:
#!/bin/bash echo "第一个参数:$1" echo "第二个参数:$2"
执行以下命令,就能在容器mycontainer里运行脚本并传递参数:
docker exec -i mycontainer bash -s argument1 argument2 < mylocal.sh
执行后容器会输出:
第一个参数:argument1 第二个参数:argument2
原理很直观:docker exec -i把本地脚本的内容通过标准输入传给容器内的bash,而-s参数告诉bash,把后面的argument1、argument2当成脚本的位置参数,这样脚本里的$1、$2就能正确获取到对应的值了。
方法二:通过环境变量传递参数
如果你的参数更适合用环境变量的形式传递(比如参数包含特殊字符,或者数量较多),可以用这种方式:
docker exec -i -e ARG1=argument1 -e ARG2=argument2 mycontainer bash < mylocal.sh
对应的脚本mylocal.sh可以直接读取环境变量:
#!/bin/bash echo "环境变量ARG1:$ARG1" echo "环境变量ARG2:$ARG2"
需要注意的是,如果你的脚本本身需要读取用户输入(依赖标准输入),第一种方法可能会有冲突——因为标准输入已经被用来传递脚本内容了。这种场景下可以结合cat和管道做调整,但大部分常规场景用第一种方法就足够了。
内容的提问来源于stack exchange,提问作者david saji




