如何在Kubernetes交互式bash pod中传入shell脚本作为输入执行?
问题说明
本地存在名为my-script.sh的Shell脚本,内容如下:
#!/bin/bash while true; do echo '1' done
已知可通过以下命令在Kubernetes集群中启动一个临时交互式Bash Pod:
kubectl run my-shell --rm -it --image bash -- bash
需求是将本地的my-script.sh作为输入,传递给上述Pod内的Bash环境执行。之前尝试的以下命令无法达到预期效果:
kubectl run my-shell --rm -it --image bash -- /bin/bash -c < my-script.sh
解决方法
原有命令无效的核心原因有两个:
- 命令中的
< my-script.sh重定向是在本地Shell环境生效,仅会把脚本内容作为kubectl进程本身的标准输入,不会自动传递给Pod内部启动的Bash进程 bash -c参数的作用是执行后面紧跟的字符串命令,本身不会从标准输入读取脚本内容
最直接的实现方式是给Pod内的Bash加上-s参数,该参数会让Bash主动从标准输入读取要执行的命令,同时把本地脚本重定向到kubectl命令的标准输入,kubectl会自动把标准输入流转发到Pod内的进程:
kubectl run my-shell --rm -it --image bash -- bash -s < my-script.sh
如果需要在脚本执行完成后保留Pod的交互式终端,可以先把脚本创建为ConfigMap挂载到Pod内再执行:
# 从本地脚本创建ConfigMap kubectl create configmap my-script-cm --from-file=my-script.sh # 启动Pod时挂载脚本,执行完后进入交互Bash kubectl run my-shell --rm -it --image bash --volume configmap/my-script-cm --mount-path=/tmp/scripts -- bash -c "bash /tmp/scripts/my-script.sh; exec bash"
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

