最小化 gcloud CLI 安装的 disk-space

Minimizing disk-space of gcloud CLI installation

我的服务器管理员将磁盘 space 限制为大约 50 Mb。 linux 上的默认 gcloud 安装(带 alpha)大约需要 150 Mb。我需要减小安装大小以适合我的驱动器 space。

我尝试使用 pyinstaller (https://www.pyinstaller.org/ ) 在 lib/gcloud.py 上,因为 bin/gcloud 是一个 bash 脚本。生成的可执行文件(在 lib/dist 中)无法运行。

我还尝试压缩一些库(lib/surface 和其他一些库)并将生成的 .zip 文件添加到 sys.path 中的 lib/gcloud.py。这应该允许 zipimport 在节省磁盘 space.

的同时使用这些 zip

虽然此方法将大小减小到 50 Mb 以下,并且对于某些 gcloud 选项效果很好,但它不适用于 cloud-shell

我注意到有很多 .pyc 文件和 .py 文件。例如 gcloud.pygcloud.pyc 都出现在 lib/ 中。现在这似乎是一种浪费,所以我在根文件夹中 运行 python -m compileall . 然后是 find . -iname '*.py' -delete 。这也没有用。但它确实将磁盘 space 减少到 40 Mb 以下。

我最感兴趣的是使用 gcloud alpha cloud-shell,而不是其他 api。使用上述方法(.zip 文件附加到 sys.path)给出此错误 gcloud alpha cloud-shell ssh/scp

ERROR: gcloud crashed (IOError): [Errno 20] Not a directory

功能齐全的 gcloud 安装目录的 zip 文件不到 20 Mb。因此必须有一种方法可以将其装入 50 Mb。有什么想法吗?

更新:

如果您习惯使用 oauth2 工作流程,请参阅下面的 joffre 的回答。

个人觉得用oauth2挺麻烦的。事实上,对我来说,gcloud CLI 的主要好处之一是,一旦 gcloud init 完成,所有身份验证问题都将得到解决。

在我之前尝试的字节编译方法中,__init__.py 文件也被删除了。 *.json 文件似乎也不是功能所必需的(尽管它们可能有帮助字符串)

python -m compileall .
find .  iname '*.py' -not -iname '__init__.py' -delete
find . -iname '*.json' -delete

这会将总安装大小降低到 40-45 Mb。

请注意,也可以执行相反的操作,即删除所有 *.pyc 而保留所有 *.py 。这也会减少 disk-space,但不会减少那么多(因为大多数 *.pyc 似乎比相应的 *.py 文件小)

您不需要 gcloud CLI 即可连接到您的云 Shell。

如果您 运行 gcloud alpha cloud-shell ssh --log-http,您将看到该工具实际在做什么,因此您可以手动复制它。

首先,确保您的 SSH public 密钥在环境中,这可以完成 through the API(甚至不需要从您尝试连接的服务器完成来自).

然后,您必须启动环境,这可以通过 this API endpoint, and you have to wait until the returned operation is finished, which can be done through this other API endpoint. Note that this can be done from your environment (which would require oauth authentication), or you can do this from an external service (e.g. program a Cloud Function 来完成,以便在调用特定端点时启动 Cloud Shell 环境。

最后,环境启动后,您需要通过 this API endpoint 获取连接到云 Shell 实例的信息(同样,甚至不需要从您正在连接的服务器),最后使用该信息从服务器通过 SSH 连接。

这会将您服务器上所需的工具限制为简单的 SSH 客户端(可能已经预先安装)。

使用我提供的链接,您可以手动完成所有这些操作并检查它是否正常工作。但是,手动执行此操作很乏味,因此我可能会创建一个 Cloud Function 来进行所有必需的 API 调用,并 return 在请求正文中提供连接信息。我什至可能懒得使用函数 return 需要 运行 的显式 ssh 命令,所以一旦我连接到服务器,我只需要 运行 curl <my_function_URL>|sh 一切都会正常。

如果您尝试做这样的事情,请务必确认这在您的设置中是安全的(因此,请确保不要在您的云 Shell 环境中添加不需要的密钥),因为我'我只是从头开始写这篇文章,并且公开 Cloud Function 感觉有点不安全(任何调用该 Cloud Function 的人至少会知道您的 Cloud Shell 环境的 IP)。但至少,这是一个你可以探索的想法。