Мы сталкиваемся с проблемами при развертывании заданий Dataflow.
Ошибка
Мы используем CustomCommands для установки частного репо на рабочих, но теперь мы сталкиваемся с ошибкой в журналах worker-startup
из наших рабочих мест:
Running command: ['pip', 'install', 'git+ssh://git@github.com/my_private_repo.git@v1.0.0']
Command output: b'Traceback (most recent call last):
File "/usr/local/bin/pip", line 6, in <module>
from pip._internal import main\nModuleNotFoundError: No module named \'pip\'\n'
Этот код работал, но со времени нашего последнего развертывания службы в пятницу он не работает.
Некоторый контекст
- Мы используем служба GAE с заданием cron для развертывания заданий потока данных с использованием python sdk
- В наших заданиях мы используем код, хранящийся в частном репозитории
- . репозитории, мы используем
setup.py
с customCommands, которые запускаются во время запуска работника. (пример кода из официального репозитория здесь ) - Команды получают закодированный ключ s sh из GCS, декодируют его с помощью KMS, получают как файл конфигурации sh для указания пути к файлу ключевые и разрешенные хосты затем выполняют
pip install git+ssh://git@github.com/my_private_repo.git@v1.0.0
(см. команды ниже)
CUSTOM_COMMANDS = [
# retrieve ssh key
["gsutil", "cp","gs://{bucket_name}/encrypted_python_repo_ssh_key".format(bucket_name=credentials_bucket), "encrypted_key"],
[
"gcloud",
"kms",
"decrypt",
"--location",
"global",
"--keyring",
project,
"--key",
project,
"--plaintext-file",
"decrypted_key",
"--ciphertext-file",
"encrypted_key",
],
["chmod", "700", "decrypted_key"],
# install git & ssh
["apt-get", "update"],
["apt-get", "install", "-y", "openssh-server"],
["apt-get", "install", "-y", "git"],
# Add ssh config which specify the location of the key & the host
[
"gsutil",
"cp",
"gs://{bucket_name}/ssh_config_gcloud".format(bucket_name=credentials_bucket),
"~/.ssh/config",
],
[
"pip",
"install",
"git+ssh://git@github.com/my_private_repo.git@v1.0.0",
],
]
Что мы пробовали
- После этой проблемы в пипсах # 5599 , кажется, что существует конфликт между несколькими версии пипа. Мы попытались переустановить его, добавив
apt-get --reinstall install -y python-setuptools python-wheel python-pip
(и другие варианты, например curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py --force-reinstall
) в CustomCommands, но без улучшения c.
Примечание:
- Задания, запущенные локально, работают (Как? Мне очень любопытно, как это может работать, поскольку CustomCommands не запускаются)
- Вход в экземпляр Compute и подключение к процессу docker и выполнение команд вручную не выполняется. t показать любой журнал ошибок
- Служба развернута с использованием пользовательского файла Docker, определенного следующим фрагментом
FROM gcr.io/google-appengine/python
RUN apt-get update && apt-get install -y openssh-server
RUN virtualenv /env -p python3.7
# Setting these environment variables are the same as running
# source /env/bin/activate.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
# Set credentials for git run pip to install all
# dependencies into the virtualenv.
... specify SSH KEY, host, to allow private git repo pull
# Add the application source code.
ADD . /app
RUN pip install -r /app/requirements.txt && python /app/setup.py install && python /app/setup.py build
CMD gunicorn -b :$PORT main:app
Есть идеи о том, как решить эту проблему, или есть какие-нибудь обходные пути?
Спасибо за помощь!
Редактировать
Это происходит в основном из-за локального состояния компьютера или наших компьютеров.
После выполнения некоторых команд, таких как python setup.py install
или python setup.py build
, я больше не могу развертывать задания (обращаясь к тому же ошибка во время worker-startup
, развернутого службой), но мой коллега все еще может развернуть задания (тот же код, та же ветвь, за исключением исключенных каталогов из .gitignore, таких как build
, dist
, ...), которые работают , В его случае CustomCommands не запускаются при развертывании задания (но работники по-прежнему могут использовать локальный упакованный конвейер).
Любой способ указать скомпилированный пакет для использования работником? Мне не удалось найти do c для этого ...
Обходной путь
Поскольку мы не смогли получить приватный код из рабочего потока данных, мы использовали следующий обходной путь:
- Создайте колесо нашего частного репо, используя
python setup.py sdist bdist_wheel
- Вставьте это колесо в наш пакет данных в
lib/my-package-1.0.0-py3-none-any.whl
- Передайте колесо в опции потока данных как дополнительный пакет ( см. код луча здесь )
Используемые команды
pipeline_options = PipelineOptions()
pipeline_options.view_as(SetupOptions).setup_file = "./setup.py"
pipeline_options.view_as(SetupOptions).extra_packages = ["./lib/my-package-1.0.0-py3-none-any.whl"]