谷歌云Shell中执行kubectl exec进入pod后BAT脚本后续命令不运行如何解决
根因说明
现有脚本的执行逻辑存在环境错位:
kubectl exec -it <pod-name> -n <node> bash会启动阻塞式的交互终端,宿主机的Shell脚本会暂停运行,直到手动退出Pod内的终端才会继续执行后续命令- 写在
kubectl exec之后的命令默认在Google Cloud Shell本地环境执行,不会自动传入Pod内部运行
修改方案
将需要在Pod内执行的命令作为参数直接传给kubectl exec即可,无需拆分写在脚本后续。修改后的完整脚本参考如下:
# 以下为Cloud Shell本地执行的命令 gcloud config set project <project-name> gcloud auth activate-service-account <keyname>@<project-name>.iam.gserviceaccount.com --key-file=<filename>.json gcloud container clusters get-credentials banting --region <region> --project <project> # 可选:自动获取命名空间下第一个Pod的名称,不需要可手动替换为固定的<pod-name> export TARGET_POD=$(kubectl get pods -n <node> -o jsonpath='{.items[0].metadata.name}') # 传入Pod内执行的命令,多容器Pod可添加-c <容器名>指定目标容器,避免默认选择报错 kubectl exec $TARGET_POD -n <node> -- bash -c " apt-get update apt install -y postgresql postgresql-contrib psql -h <hostname> -p <port> -d <database> -U <userId> "
注意事项
- 不需要交互式终端时可去掉
kubectl exec的-it参数;如果需要执行完命令后停留在Pod的交互界面,可保留-i参数 apt install添加-y参数可跳过安装确认的交互步骤,避免脚本执行卡住- 若Pod包含多个容器,可在
kubectl exec中添加-c <目标容器名>参数指定执行命令的容器,即可消除Defaulted container的提示
内容的提问来源于stack exchange,提问作者Hemendra
相关产品推荐
相关产品推荐

