如何在 Dataflow Worker 上安装私有存储库?

Col*_*ost 5 python google-cloud-dataflow apache-beam

我们在 Dataflow 作业部署期间遇到了问题。

错误

我们正在使用 CustomCommands 在 worker 上安装私有 repo,但现在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' 
Run Code Online (Sandbox Code Playgroud)

这段代码是有效的,但自从我们上次在周五部署该服务以来,它就没有了。

一些上下文

  1. 我们使用带有 cron 作业的 GAE 服务来部署数据流作业,使用 python sdk
  2. 在我们的工作中,我们使用存储在私有存储库中的代码
  3. 为了允许工作人员提取私有存储库,我们使用了setup.py在工作人员启动期间运行的自定义命令。(来自官方仓库的代码示例在这里
  4. 这些命令从 GCS 检索编码的 ssh 密钥,使用 KMS 对其进行解码,获取 ssh 配置文件以指定密钥的路径和允许的主机,然后执行pip install git+ssh://git@github.com/my_private_repo.git@v1.0.0(请参阅下面的命令)

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' 
Run Code Online (Sandbox Code Playgroud)

我们尝试过的

  • 继 pip #5599 中的这个问题之后,似乎几个版本的 pip 之间存在冲突。我们尝试在 CustomCommands 中添加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 没有运行)
  • 登录计算实例并连接到 docker 进程并手动运行命令不会显示任何错误日志
  • 使用由以下代码段定义的自定义 Dockerfile 部署服务

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",
    ],
]
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法,或任何可用的解决方法?

谢谢你的帮助 !

编辑

这似乎主要是由于机器或我们的计算机的本地状态。

运行诸如python setup.py install或 之类的一些命令后python setup.py build,我现在无法再部署作业(worker-startup在服务部署期间面临相同的错误),但我的同事仍然能够部署作业(相同的代码、相同的分支,除了 . gitignore like build, dist, ...) 正在运行。在他的情况下,CustomCommands 不在作业部署上运行(但工作人员仍然能够使用本地打包管道)。

有什么方法可以指定工作人员使用的编译包?我找不到关于那个的文档......

解决方法

由于我们无法从数据流工作线程中提取私有代码,我们使用了以下解决方法:

  • 使用我们的私人仓库构建一个轮子 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"]
Run Code Online (Sandbox Code Playgroud)

rob*_*twb 2

对于不重要的公共依赖项,我建议使用自定义容器并提前安装所有依赖项。