Я настроил вычислительный образ со всем, что мне нужно для выполнения этой задачи. Когда я создаю новый экземпляр, я хочу, чтобы он автоматически запускал команду при запуске. Я использовал --metadata
вариант с google cloud compute create
, и предоставил сценарий. Все работало хорошо, пока не потребовались некоторые приложения, которые были в настраиваемой среде conda. Я пробовал добавить conda activate
где применимо, и ничего не работало. Есть ли способ активировать эту среду при запуске этих сценариев запуска?
В частности, это было немного сложно, потому что при тестировании я столкнулся с несколькими оговорками:
Сначала я пытался динамически выбирать интерпретатор скрипта, но сразу понял, что это невозможно.
Вместо этого я решил использовать два разных сценария запуска (init.sh и conda.sh), один из которых устанавливает и настраивает среду conda и заменяет существующий сценарий другим, который впоследствии запускает команды conda. Я сделал это отчасти потому, что скрипты с интерпретатором вроде #!/usr/bin/env python
не будет правильно работать в сценарии запуска. Я не смог точно определить причину, по которой это происходит.
Это также необходимо, потому что после установки conda вам нужно закрыть и снова открыть текущую оболочку, и я добился этого с помощью простой перезагрузки.
Помните, что сценарии запуска запускаются от имени пользователя root.
Я размещаю оба сценария в облачном хранилище, однако вы можете хранить их где угодно, пока экземпляр может получить доступ и загрузить их. Я тестировал все на экземпляре Debian 9. Не стесняйтесь редактировать любой из них в соответствии со своими потребностями.
Сначала добавьте сценарий запуска в свой экземпляр, а затем включите его:
gcloud compute instances add-metadata [INSTANCE_NAME] --metadata startup-script-url=gs://[BUCKET]/init.sh
Вот содержание init.sh:
#!/bin/bash
# Prophylactically update all the packages, optional.
apt -y update && apt -y upgrade
# Downloads and installs miniconda silently
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh
bash ~/miniconda.sh -b -p $HOME/miniconda
# Also prophylactic just to make sure commands run properly
export PATH="$HOME/miniconda/bin:$PATH"
# Initiate the conda environment
conda init
# Make sure the environment is activated by default
conda config --set auto_activate_base true
# Removes the current startup script and replaces it with the other
gcloud compute instances remove-metadata [INSTANCE_NAME] --zone [ZONE] --keys=startup-script-url
gcloud compute instances add-metadata [INSTANCE_NAME] --zone [ZONE] --metadata startup-script-url=gs://[BUCKET]/conda.sh
# Necessary to run conda commands still within a startup script (workaround to close and re-open your current shell)
reboot
Вот содержание conda.sh:
#!/bin/bash
# Again, prophylactic just to make sure commands run properly
export PATH="$HOME/miniconda/bin:$PATH"
# Simple test to make sure everything works
conda -V > /condatest.txt
Если condatest.txt заполнен вашей установленной версией (в моем случае это была conda 4.7.10), это означает, что вы успешно.
Наконец, очень важно, чтобы вы настройте области доступа к Cloud API вашего экземпляра для чтения / записи Compute Engine, поскольку по умолчанию вы не сможете редактировать метаданные вашего instace изнутри экземпляра (я столкнулся с чем-то похожим на этот).
Если вам нужны инструменты отладки, вы можете включить вывод последовательной консоли чтобы увидеть, что делает экземпляр во время загрузки, и вы также можете запускать сценарии запуска вручную с включенной отладкой чтобы увидеть, где он рушится.