Минимизация дискового пространства при установке gcloud CLI - PullRequest
0 голосов
/ 12 февраля 2019

Администратор моего сервера ограничивает дисковое пространство до 50 Мб.Установка gcloud по умолчанию (с альфа-версией) в Linux занимает около 150 Мб.Мне нужно уменьшить размер установки, чтобы она соответствовала месту на диске.

Я пытался использовать pyinstaller (https://www.pyinstaller.org/) на lib/gcloud.py, поскольку bin/gcloud - это скрипт bash.Полученный исполняемый файл (в lib/dist) не работал.

Я также попытался заархивировать некоторые библиотеки (lib/surface и некоторые другие) и добавил полученные ZIP-файлы к sys.path в lib/gcloud.py.Это должно позволить zipimport использовать эти архивы при сохранении дискового пространства.

Хотя этот подход уменьшил размер до уровня ниже 50 Мб и работает довольно хорошо для некоторых опций gcloud, он не работает для cloud-shell.

Я заметил, что существует много файлов .pyc вместе с файлами .py.Например, gcloud.py и gcloud.pyc присутствуют в lib/.Теперь это кажется пустой тратой, поэтому я запустил python -m compileall . в корневой папке, а затем find . -iname '*.py' -delete.Это тоже не сработало.Но это уменьшило дисковое пространство ниже 40 Мб.

Меня больше всего интересует использование gcloud alpha cloud-shell, а не других API-интерфейсов.Использование описанного выше подхода (файлы .zip, добавленные к sys.path) дает эту ошибку с gcloud alpha cloud-shell ssh/scp

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

Размер zip-файла полнофункционального установочного каталога gcloud составляет менее 20 Мб.Таким образом, должен быть способ соответствовать этому в 50 Мб.Есть идеи?

ОБНОВЛЕНИЕ:

Если вам удобно использовать рабочий процесс oauth2, см. Ответ Джоффра ниже.

Лично я нахожу довольно затруднительным использование oauth2.Фактически, одно из основных преимуществ CLI gcloud для меня заключается в том, что после выполнения gcloud init все проблемы с аутентификацией решаются.

В методе байтовой компиляции, который я пробовал ранее, __init__.py файлы также удалялись.Файлы *.json также не важны для функциональности (хотя они могут содержать строки справки)

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

Это уменьшает общий размер установки до 40-45 Мб.

обратите внимание, что также возможно сделать обратное, то есть удалить все *.pyc, сохранив все *.py.Это также уменьшит дисковое пространство, но не так сильно (поскольку большинство *.pyc кажутся меньше соответствующих *.py файлов)

1 Ответ

0 голосов
/ 12 февраля 2019

Вам не нужен CLI gcloud для подключения к Cloud Shell.

Если вы запустите gcloud alpha cloud-shell ssh --log-http, вы увидите, что на самом деле делает инструмент, поэтому вы можете вручную скопировать это.

Во-первых, убедитесь, что ваш открытый ключ SSH находится в среде, что можно сделать через API (это даже не нужно делать с сервера, к которому вы пытаетесь подключиться).from).

Затем необходимо запустить среду, что можно сделать с помощью этой конечной точки API , и дождаться завершения возвращенной операции, что можно сделать с помощью эта другая конечная точка API .Обратите внимание, что это может быть сделано из вашей среды (что потребует oauth-аутентификации), или вы можете сделать это из внешней службы (например, запрограммируйте Cloud Function , чтобы запустить среду Cloud Shell при вызове определенной конечной точки).

Наконец, после запуска среды вам нужно получить информацию для подключения к вашему экземпляру Cloud Shell, хотя эта конечная точка API (что, опять же, даже не нужносделано с сервера, с которого вы подключаетесь), и, наконец, подключитесь через SSH с сервера с этой информацией.

Это ограничит инструменты, необходимые на вашем сервере, простым клиентом SSH (который, вероятно, ужеустановлен).

Используя предоставленные мной ссылки, вы можете сделать все это вручную и проверить, правильно ли это работает.Однако это утомительно делать вручную, поэтому я, скорее всего, создаю облачную функцию, которая выполняет все необходимые вызовы API и возвращает информацию о соединении в теле запроса.Возможно, мне даже лень, чтобы функция возвращала явную команду ssh, которую нужно запустить, поэтому после подключения к серверу мне нужно просто запустить curl <my_function_URL>|sh и все будет работать.

Если вы попытаетесь сделать что-то подобное, обязательно убедитесь, что это безопасно в вашей настройке (поэтому не добавляйте ненужные ключи в вашу среду Cloud Shell), так как я просто пишу это из верхней части моегои обладать открытой Облачной функцией чувствует себя несколько небезопасно (любой, кто вызывает эту Облачную функцию, по крайней мере, знает IP вашей среды Cloud Shell).Но, по крайней мере, это идея, которую вы могли бы изучить.

...