gpt4 book ai didi

python - 如何将 gRPC Python 插件与 Docker 和 Google Cloud Builds 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:48 39 4
gpt4 key购买 nike

TL,DR;

  • 在生成 API 描述 rune 件时,哪种 Linux Docker 镜像运行 Python gRPC 插件的速度最快/最轻?
  • 上述 API 描述符是否应成为 Cloud Build artifact并保存到云存储桶?
    • ...为了使用 gcloud 将 API 部署到 Cloud Endpoints。

详情

我运行一个 Python gRPC service和在 Google Compute Engine 上运行的 Docker 容器中的 ESP . About gRPC > API management显示了我的应用程序架构图:

enter image description here

我的高级构建步骤:


1) 使用 protoc protocol buffers 编译器创建描述 rune 件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) Deploy the proto descriptor文件 (api_descriptor.pb) 和使用 gcloud 命令行工具的配置文件:

gcloud endpoints services deploy api_descriptor.pb api_config.yaml

3) Generate gRPC code使用 Python 插件:

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 official builder images .

1) ???

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

3) ???

4) 使用cloud-builders/docker构建“gRPC 服务器”Docker 镜像。

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

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

AFAICT 步骤 1) 应该生成 Cloud Build artifact api_descriptor.pb 并保存到云存储桶。

  • 在生成 API 描述 rune 件时,哪种 Linux Docker 镜像运行 Python gRPC 插件的速度最快/最轻?
  • 上述 API 描述符是否应成为 Cloud Build artifact并保存到云存储桶?
    • ...为了使用 gcloud 将 API 部署到 Cloud Endpoints。

最佳答案

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

TL,DR; 如果您只想使用 protoc使用 Google Cloud Build,我提交了一个 protoc生成器到 cloud builders community GitHub repository已被接受。参见 cloud-builders-community/protoc .

详细信息;我的解决方案依赖于创建 protoc Custom Build Step .这会创建一个 Docker 容器镜像,Cloud Build worker 在需要运行时拉取并运行 protoc .

您只需要两个文件即可创建 Custom Build Step , 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. 定义我们想要结束的最终“协议(protocol)”图像的第一个只读层。我选择 Ubuntu 是因为它是我在本地运行的。任何最小的 Linux“基本镜像”都可以,但必须安装以下二进制文件:apt-get , wget , unzip , 和 rm :

FROM ubuntu

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

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(从网络服务器检索内容)和解压缩

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/

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

ENTRYPOINT ["protoc"]

  1. 使用CMD指令,以便在运行 protoc 时如果未提供任何选项图片,protoc --help将运行:

CMD ["--help]

这就是我们定义可执行文件所需的全部protoc docker 形象。但是,它还不是 Custom Build Step可用于 Google's 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,因此,该名称将引用工件: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 中运行的自定义构建步骤。

关于python - 如何将 gRPC Python 插件与 Docker 和 Google Cloud Builds 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51842688/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com