Как установить частный репозиторий на Dataflow Worker? - PullRequest
3 голосов
/ 06 января 2020

Мы сталкиваемся с проблемами при развертывании заданий 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' 

Этот код работал, но со времени нашего последнего развертывания службы в пятницу он не работает.

Некоторый контекст

  1. Мы используем служба GAE с заданием cron для развертывания заданий потока данных с использованием python sdk
  2. В наших заданиях мы используем код, хранящийся в частном репозитории
  3. . репозитории, мы используем setup.py с customCommands, которые запускаются во время запуска работника. (пример кода из официального репозитория здесь )
  4. Команды получают закодированный ключ 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"]
...