python - 最小化 gcloud CLI 安装的磁盘空间
问题描述
我的服务器管理员将磁盘空间限制为大约 50 Mb。linux 上的默认 gcloud 安装(带有 alpha 版本)大约需要 150 Mb。我需要减小安装大小以适应我的驱动器空间。
我尝试在 上使用 pyinstaller ( https://www.pyinstaller.org/
) lib/gcloud.py
,因为bin/gcloud
它是一个 bash 脚本。生成的可执行文件 (in lib/dist
) 不起作用。
我还尝试压缩一些库(lib/surface
和其他一些库)并将生成的 .zip 文件添加到sys.path
in lib/gcloud.py
。这应该允许zipimport
在节省磁盘空间的同时使用这些 zip。
虽然这种方法将大小减小到 50 Mb 以下,并且对于某些gcloud
选项非常有效,但它不适用于cloud-shell
.
.pyc
我注意到文件中有很多.py
文件。例如gcloud.py
和gcloud.pyc
都存在于lib/
. 现在这似乎很浪费,所以我python -m compileall .
在根文件夹中运行,然后是find . -iname '*.py' -delete
. 这也没有奏效。但它确实将磁盘空间减少到 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
。这也会减少磁盘空间,但不会减少那么多(因为大多数*.pyc
似乎比相应的*.py
文件小)
解决方案
您不需要 gcloud CLI 即可连接到 Cloud Shell。
如果您运行gcloud alpha cloud-shell ssh --log-http
,您将看到该工具实际在做什么,因此您可以手动复制它。
首先,确保您的 SSH 公钥在环境中,这可以通过 API完成(甚至不需要从您尝试连接的服务器完成)。
然后,你必须启动环境,这可以通过这个 API 端点来完成,你必须等到返回的操作完成,这可以通过这个其他 API 端点来完成。请注意,这可以在您的环境中完成(这将需要 oauth 身份验证),或者您可以从外部服务中执行此操作(例如,在调用特定端点时编写一个云函数以启动 Cloud Shell 环境)。
最后,一旦环境启动,您需要通过此 API 端点获取连接到 Cloud Shell 实例的信息(同样,甚至不需要从您连接的服务器完成),最后连接通过带有该信息的服务器的 SSH。
这会将您的服务器上所需的工具限制为一个简单的 SSH 客户端(可能已经预先安装)。
使用我提供的链接,您可以手动完成所有这些并检查它是否正常工作。但是,手动执行此操作很乏味,因此我可能会创建一个云函数来进行所有必需的 API 调用,并在请求正文中返回连接信息。我什至可能懒得让函数返回需要运行的显式 ssh 命令,所以一旦我连接到服务器,我只需要运行curl <my_function_URL>|sh
,一切都会正常运行。
如果您尝试执行此类操作,请务必验证您的设置是否安全(因此,请确保不要在您的 Cloud Shell 环境中添加不需要的密钥),因为我只是从我的顶部编写此头部,并且拥有暴露的 Cloud Function 感觉有点不安全(任何调用 Cloud Function 的人至少会知道您的 Cloud Shell 环境的 IP)。但至少,这是一个你可以探索的想法。
推荐阅读
- c# - 如何使用 selenium C# 访问 HTML 表
- java - 将 angular2-query-builder 查询转换为逻辑表达式
- android - 使用变量时的 Gradle 库版本建议
- java - 位图“图像”传递给另一个活动(内存不足)
- ruby - 如何在更新 xml 节点的内容时保留 CDATA?
- java - IDEA java总是生成私有方法
- java - 在 android 上加载 mapbox 地图后立即显示标记标题
- python - 将 CSV 名称更改为 CSV 日期时间 python
- javascript - React - 我如何关闭所有其他工具提示?
- php - 合并两个集合 Laravel