postgresql - 在 Google Cloud Shell 编辑器中连接到 kubectl pod 后,BAT 文件中的 Bash 脚本未运行
问题描述
对于我的项目,我必须使用一系列命令连接到 Google Cloud Shell 中的 postgres 数据库:
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>
kubectl get pods -n <node>
kubectl exec -it <pod-name> -n <node> bash
apt-get update
apt install postgresql postgresql-contrib
psql -h <hostname> -p <port> -d <database> -U <userId>
`
我是这方面的初学者,到目前为止只是运行通过复制粘贴提供给我的脚本。但为了让事情变得更简单,我在 Shell 编辑器中创建了一个 .bat 文件,其中包含上述所有命令,并尝试使用bash <filename>
但是一旦kubectl exec -it <pod-name> -n <node> bash
命令运行并像下面这样打开新目录,其余的命令就不会运行。
Defaulted container "<container>" out of: <node>, istio-proxy, istio-init (init)
root@<pod-name>:/#
那么如何让 shell 运行 .bat 文件中的其余脚本:
apt-get update
apt install postgresql postgresql-contrib
psql -h <hostname> -p <port> -d <database> -U <userId>
`
解决方案
Cloud Shell 是一个 Linux 实例,默认为 Bash shell。
BAT
通常指 Windows|DOS 批处理文件。
在 Linux 上,shell 脚本通常是.sh
.
您的脚本需要修改,以便将用于该 kubectl exec
命令的命令传递给 Pod 而不是当前脚本。
您可以尝试(!)以下内容。它在 Pod 上创建一个 Bash(子)shell 并运行其中列出的命令-c
:
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>
kubectl get pods -n <node>
kubectl exec -it <pod-name> -n <node> bash -c "apt-get update && apt install postgresql postgresql-contrib && psql -h <hostname> -p <port> -d <database> -U <userId>"
但是,我有一些反馈|建议:
- 目前还不清楚这种方法是否会奏效,因为你在跑步
psql
但什么也没做。从理论上讲,我认为您也可以将脚本传递给psql
命令,但是您的脚本变得非常笨拙。 - 在容器中安装软件被认为是不好的做法。建议是预先创建要运行的映像并使用它。建议容器是不可变的
- 我鼓励您在编写脚本时使用长标志,因为短标志 (
-n
) 可能会令人困惑,而--namespace=
更清晰 (IMO)。是的,这些需要更长的时间才能输入,但结果是您的脚本更清晰。当您在命令行上进行黑客攻击时,短标志很好。 - 我鼓励你不要使用
gcloud config set
eggcloud config set project ${PROJECT}
。这设置了全局值。并且它的使用令人困惑,因为后续命令隐式使用这些值。有趣的是,您提供了一个很好的例子来说明为什么这可能具有挑战性。即使您已经隐式设置了using的值,您的后续命令也会gcloud container clusters get-credentials --project=${PROJECT}
显式使用该标志(这很好) 。--project
project
gcloud config set project
推荐阅读
- swift - 如何在 SwiftUI 中打开通知点击的特定视图?
- excel - 计算给定时间范围内某个区间内的每个“x”?
- r - 在函数中定义输出名称
- vue.js - Vue.js 表更新组件数据而不在选定的过滤器上重新渲染整个组件
- android - 没有@Inject 构造函数或@Provides-annotated 方法无法提供如何解决
- typescript - 如何在打字稿中调用具有多种类型数组的地图函数
- javascript - 谷歌表格 - 优化在一定范围内创建笔记的功能(非常慢)
- php - 完整地址 $_SERVER["HTTP_REFERER"];
- machine-learning - 无论输入如何,我的 RandomForest 都会为 model.predict_proba() 返回完全相同的概率
- sql - Oracle SQL 数据库内存中 - 比较压缩大小