使用 Python 2.7 和 Apache Beam 的 Cloudbuild

Cloudbuild with Python 2.7 and Apache Beam

我在 Python 2.7 上使用 Apache Beam 创建了一个在 Google Dataflow 上运行的管道。当我从我的笔记本电脑在本地部署该管道时,它运行良好。我现在希望通过 CloudBuild 部署它。这是我的 cloudbuild.yaml 文件:

steps:
  - name: "docker.io/library/python:2.7"
    args: ["pip", "install", "-t", "/workspace/lib", "-r", "requirements.txt"]
  - name: "docker.io/library/python:2.7"
    args: ["python2", "tests.py"]
    env: ["PYTHONPATH=/workspace/lib"]

当触发 CloudBuild 时,它成功安装了所有要求,但是当它尝试在 tests.py 文件中导入 apache_beam 时,我收到以下错误:

   File "tests.py", line 3, in <module>
     import apache_beam as beam
   File "/workspace/lib/apache_beam/__init__.py", line 97, in <module>
     from apache_beam import coders
   File "/workspace/lib/apache_beam/coders/__init__.py", line 19, in <module>
     from apache_beam.coders.coders import *
   File "/workspace/lib/apache_beam/coders/coders.py", line 29, in <module>
     import google.protobuf.wrappers_pb2
 ImportError: No module named google.protobuf.wrappers_pb2

在 requirements.txt 文件中,我有 除其他外 以下内容:

apache-beam==2.16.0
protobuf==3.11.0

注意:requirements.txt 中列出了所有必要的要求,因为我可以在本地部署管道。

我只用另一个名为 tests.py 的文件重现了您的问题:

import apache_beam as beam

在某些社区似乎是known issue

首先,如果不使用已弃用的 Python2,而是使用 Python3.7,则不会发生此错误。我想虽然 Python2.7 是必需的。

我创建了一个 Dockerfile,例如:

FROM python:2

WORKDIR /usr/src/app

COPY requirements.txt ./

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./tests.py" ]

然后,更改了 cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quickstart-image', '.' ]

构建成功:

Step 5/6 : COPY . .
 ---> 082407f9672d
Step 6/6 : CMD [ "python", "./tests.py" ]
 ---> Running in 7d53e96370f9
Removing intermediate container 7d53e96370f9
 ---> d60a6d473d21
Successfully built d60a6d473d21