首页 > 解决方案 > 在 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>
`

标签: postgresqlshellkubernetesgoogle-cloud-shellgoogle-cloud-shell-editor

解决方案


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>"

但是,我有一些反馈|建议:

  1. 目前还不清楚这种方法是否会奏效,因为你在跑步psql但什么也没做。从理论上讲,我认为您也可以将脚本传递给psql命令,但是您的脚本变得非常笨拙。
  2. 在容器中安装软件被认为是不好的做法。建议是预先创建要运行的映像并使用它。建议容器是不可变的
  3. 我鼓励您在编写脚本时使用长标志,因为短标志 ( -n) 可能会令人困惑,而--namespace=更清晰 (IMO)。是的,这些需要更长的时间才能输入,但结果是您的脚本更清晰。当您在命令行上进行黑客攻击时,短标志很好。
  4. 我鼓励你不要使用gcloud config seteg gcloud config set project ${PROJECT}。这设置了全局值。并且它的使用令人困惑,因为后续命令隐式使用这些值。有趣的是,您提供了一个很好的例子来说明为什么这可能具有挑战性。即使您已经隐式设置了using的值,您的后续命令也会gcloud container clusters get-credentials --project=${PROJECT}显式使用该标志(这很好) 。--projectprojectgcloud config set project

推荐阅读