【问题标题】:Minimizing disk-space of gcloud CLI installation最小化 gcloud CLI 安装的磁盘空间
【发布时间】:2019-02-12 09:38:49
【问题描述】:

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

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

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

虽然这种方法将大小减小到 50 Mb 以下,并且对于某些 gcloud 选项非常有效,但它不适用于 cloud-shell

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

我最感兴趣的是使用gcloud alpha cloud-shell,而不是其他api。使用上述方法(附加到sys.path 的.zip 文件)会在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 。这也会减少磁盘空间,但不会减少那么多(因为大多数 *.pyc 似乎小于相应的 *.py 文件)

【问题讨论】:

  • 您是否尝试过与您的服务器管理员交谈?
  • :) 。好吧,我希望这里的聪明人能帮助我找到一个避免与管理员交谈的解决方案。

标签: python python-2.7 google-cloud-platform gcloud google-cloud-shell


【解决方案1】:

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

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

首先,确保您的 SSH 公钥在环境中,这可以通过 through the API 完成(甚至不需要从您尝试连接的服务器上完成)。

然后,要启动环境,可以通过this API endpoint完成,还要等到返回的操作完成,可以通过this other API endpoint完成。请注意,这可以在您的环境中完成(这需要 oauth 身份验证),或者您可以从外部服务中执行此操作(例如,编写 Cloud Function 以在您调用特定端点时启动 Cloud Shell 环境)。

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

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

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

如果您尝试执行此类操作,请务必验证您的设置是否安全(因此,请确保不要在您的 Cloud Shell 环境中添加不需要的密钥),因为我只是从在我的脑海中,暴露的云函数感觉有点不安全(任何调用云函数的人至少会知道你的 Cloud Shell 环境的 IP)。但至少,这是一个你可以探索的想法。

【讨论】:

  • 这看起来是一种可行的方法。您能否举一个简短的示例(curl 或 python)来说明如何将其与 oauth2 一起使用?我的 ~/.config/gcloud 有两个文件 access_tokens.db 和 credentials.db 可能被 gcloud 用来获取访问令牌。谢谢。
  • 我不建议您手动执行 oauth 流程。一个好主意是使用oauth2l,如this totally unrelated documentation 中所述。我认为该工具足够轻巧,可以满足您的需求。
  • 等等,忽略我之前的评论。只需查看the oauth2l repo in GitHub 以获取有关如何使用它的说明。我认为oauth2l header --sso 是您要找的。​​span>
  • 感谢您的帮助。这个答案无疑是正确的,所以我会“接受”它。但我最终使用了另一种方法(见上面的编辑),所以我不会赞成它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多