5

TL,博士;

  • 在生成 API 描述符文件时,运行 Python gRPC 插件最快/最轻的 Linux Docker 映像是什么?
  • 上述 API 描述符是否应该成为 Cloud Build工件并保存到 Cloud Storage 存储桶中?
    • ...为了用于gcloud将 API 部署到 Cloud Endpoints。

细节

我在Google Compute Engine上运行的 Docker 容器中运行Python gRPC 服务和 ESP 。关于 gRPC > API 管理展示了我的应用架构图:

在此处输入图像描述

我的高级构建步骤:


1)使用 protoc 协议缓冲区编译器创建描述符文件, 。api_descriptor.pb

python -m grpc_tools.protoc \
    --include_imports \
    --include_source_info \
    --proto_path=. \
    --descriptor_set_out=api_descriptor.pb \
    --python_out=generated_pb2 \
    --grpc_python_out=generated_pb2 \
    bookstore.proto

2) 使用 gcloud 命令行工具部署 proto 描述符文件 ( ) 和配置文件:api_descriptor.pb

gcloud endpoints services deploy api_descriptor.pb api_config.yaml

3) 使用 Python 插件生成 gRPC 代码:

python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto

4)构建最终的 Docker 映像以部署在Google Compute Engine上。生成的 Docker 映像应包括:

  • 从第 3 步生成的 gRPC 代码)。
  • gRPC 服务器所需的任何其他 Python 包。

第 4 步)使用以下 Dockerfile 构建“gRPC 服务器”(附图中最右边的蓝色框):

FROM gcr.io/google_appengine/python:latest

WORKDIR .
EXPOSE 8081
ENTRYPOINT ["python", "server.py"]

ADD requirements.txt .
ADD protos ./protos

RUN mkdir out

RUN apt-get update && \
    apt-get install -y python2.7 python-pip && \
    pip install -r requirements.txt


RUN python \
    -m grpc_tools.protoc \
    --python_out=out \
    --grpc_python_out=out \
    --proto_path=. \
    bookstore.proto

我正在将这些构建步骤迁移到 Google 的Cloud Build

AFAICT 我的高级构建步骤应该映射到 Cloud Builder官方构建器图像

1)???

2) 使用cloud-builders/gcloud/运行gcloud命令。

3)???

4) 使用cloud-builders/ docker 构建 'gRPC Server' Docker 镜像。

步骤 2) 和 3) 已经有可用的云构建器(请参阅GoogleCloudPlatform/cloud-builders)。

但是,我不确定如何将步骤1)3)迁移到 Cloud Build。这两个步骤都需要运行基础 Linux Docker 映像中不可用的 Python 插件。

AFAICT 步骤 1) 应生成 Cloud Build工件api_descriptor.pb保存到 Cloud Storage Bucket。

  • 在生成 API 描述符文件时,运行 Python gRPC 插件最快/最轻的 Linux Docker 映像是什么?
  • 上述 API 描述符是否应该成为 Cloud Build工件并保存到 Cloud Storage 存储桶中?
    • ...为了用于gcloud将 API 部署到 Cloud Endpoints。
4

1 回答 1

1

几个月前我得到了这个工作。我不知道我是否以“正确”的方式做到了。自己判断:p

TL,博士;如果您只想使用protocGoogle Cloud Build,我已向云构建者社区 GitHub 存储库protoc提交了一个构建器,该存储库已被接受。请参阅cloud-builders-community/protoc

细节; 我的解决方案依赖于创建protoc Custom Build Step。这将创建一个 Docker 容器映像,Cloud Build 工作人员在需要运行时提取并运行它protoc

您只需要两个文件来创建自定义构建步骤protoc

  1. cloudbuild.yaml- 告诉 Google Cloud Builder 如何构建 Docker 映像。
  2. Dockerfile- 告诉 Docker 如何构建包含protoc二进制文件的环境。

这实际上是我实现步骤 1 的本地目录结构:

.
├── cloudbuild.yaml
└── Dockerfile

Docker 文件是protoc安装命令的位置,是两个文件中更复杂的一个:

FROM ubuntu

ARG PROTOC_VERSION=3.6.1
ARG PROTOC_TARGET=linux-x86_64
ARG ASSET_NAME=protoc-${PROTOC_VERSION}-${PROTOC_TARGET}.zip

RUN apt-get -qy update && apt-get -qy install python wget unzip && rm -rf /var/lib/apt/lists/*

RUN echo "${PROTOC_VERSION}/${ASSET_NAME}"

RUN wget https://github.com/google/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-${PROTOC_TARGET}.zip && \
unzip ${ASSET_NAME} -d protoc && rm ${ASSET_NAME}

ENV PATH=$PATH:/protoc/bin/
ENTRYPOINT ["protoc"]
CMD ["--help]

打破这个:

  1. 定义我们想要结束的最终“协议”图像的第一个只读层。我选择了 Ubuntu,因为它是我在本地运行的。任何最小的 Linux “基础映像”都可以,但它必须安装以下二进制文件:apt-getwgetunziprm

FROM ubuntu

  1. 设置一些变量,用户可以在构建时通过 docker build 命令使用--build-arg <varname>=<value>标志传递给构建器:

ARG PROTOC_VERSION=3.6.1

ARG PROTOC_TARGET=linux-x86_64

ARG ASSET_NAME=protoc-${PROTOC_VERSION}-${PROTOC_TARGET}.zip

  1. 运行apt-get -qy update以“从源重新同步包索引文件”。q省略进度指示器,y假设是对遇到的任何提示的回答:

RUN apt-get -qy update

  1. 安装PythonWget(从 Web 服务器检索内容)和Unzip

RUN apt-get -qy install python wget unzip

  1. 删除作为先前步骤的一部分创建的所有文件(不再需要):

RUN rm -rf /var/lib/apt/lists/*

前面三个RUN指令可以合二为一:

RUN apt-get -qy update && apt-get -qy install python wget unzip && rm -rf /var/lib/apt/lists/*

  1. 使用ENV指令更新PATH环境以包含protoc二进制文件在最终环境(图像)中的位置。

ENV PATH=$PATH:/protoc/bin/

设置图像的入口点,使图像作为protoc可执行文件运行。不,由于上一步添加protoc$PATH,我们只需要指定要运行的二进制文件(不是完整路径):

ENTRYPOINT ["protoc"]

  1. 使用CMD指令,如果在运行protoc映像时没有提供任何选项,protoc --help将运行:

CMD ["--help]

这就是我们定义可执行protocDocker 映像所需的全部内容。但是,它还不是可以在Google 的 Cloud Build环境中使用的自定义构建步骤。我们必须使用以下方法定义自定义构建步骤:cloudbuild.yaml

steps:
  - name: 'gcr.io/cloud-builders/docker'
    args:
      [
        'build',
        '--tag',
        'gcr.io/$PROJECT_ID/protoc',
        '--cache-from',
        'gcr.io/$PROJECT_ID/protoc',
        '.',
      ]
images: ['gcr.io/$PROJECT_ID/protoc']

此文件将生成gcr.io/my-cloud-project-id/protoc可用于protocGoogle Cloud Build中运行的工件。此自定义构建步骤的示例用法:

steps:
  - name: 'gcr.io/$PROJECT_ID/protoc'
    args:
      [
        '--include_imports',
        '--include_source_info',
        '--proto_path',
        '.',
        '--descriptor_set_out',
        'api_descriptor.pb',
        'v1/my-api-proto.proto',
      ]

Cloud Build 会自动将 $PROJECT_ID 替换为您的项目 ID,因此,名称将引用 artefact: gcr.io/my-cloud-project-id/protoc。由于这是一个可执行的 Docker 镜像(用 定义ENTRYPOINT ["protoc"]),它相当于在本地运行:

protoc --include_imports --include_source_info --proto_path . --descriptor_set_out api_descriptor.pb v1/my-api-proto.proto

因此,在回答我的问题时,1) 和 3) 都可以使用protoc自定义构建步骤在 Google Cloud Build 中运行。

于 2018-11-18T13:43:33.003 回答