如何在Docker和Google Cloud构建中使用gRPC Python插件?

如何在Docker和Google Cloud构建中使用gRPC Python插件?,python,docker,google-cloud-platform,gcloud,google-cloud-build,Python,Docker,Google Cloud Platform,Gcloud,Google Cloud Build,TL,DR 在生成API描述符文件时,哪个Linux Docker映像运行Python gRPC插件最快/最轻 上述API描述符是否应该成为云构建并保存到云存储桶中? …以便使用gcloud将API部署到云端点 细节 我在运行的Docker容器中运行和ESP。显示了我的应用程序体系结构图: 我的高级构建步骤: 1)使用protoc协议缓冲区编译器创建描述符文件api_descriptor.pb python -m grpc_tools.protoc \ --include_i

TL,DR

  • 在生成API描述符文件时,哪个Linux Docker映像运行Python gRPC插件最快/最轻
  • 上述API描述符是否应该成为云构建并保存到云存储桶中?
    • …以便使用
      gcloud
      将API部署到云端点
细节

我在运行的Docker容器中运行和ESP。显示了我的应用程序体系结构图:

我的高级构建步骤:


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)文件(
api_descriptor.pb
)和使用gcloud命令行工具的配置文件:

gcloud endpoints services deploy api_descriptor.pb api_config.yaml
3)使用Python插件:

python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto
4)构建要部署的最终Docker映像。生成的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
我正在将这些构建步骤迁移到谷歌的

AFAICT我的高级构建步骤应该映射到Cloud Builder

1)

2) 用于运行
gcloud
命令

3)

4) 用于构建“gRPC服务器”Docker映像

步骤2)和3)已经有了可用的云构建器(请参阅)

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

AFAICT步骤1)应为
api_descriptor.pb
生成云构建,并保存到云存储桶中

  • 在生成API描述符文件时,哪个Linux Docker映像运行Python gRPC插件最快/最轻
  • 上述API描述符是否应该成为云构建并保存到云存储桶中?
    • …以便使用
      gcloud
      将API部署到云端点

我几个月前就把它修好了。我不知道我是否用了“正确”的方法。自己判断:p

TL,DR如果您只想在Google Cloud Build中使用
protoc
,我已经向已被接受的提交了一个
protoc
builder。看

细节我的解决方案依赖于创建
协议
。这将创建一个Docker容器映像,云构建工作人员将在需要运行
protoc
时提取并运行该映像

您只需要两个文件即可创建,
protoc

  • cloudbuild.yaml
    -告诉Google Cloud Builder如何构建Docker映像
  • 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]
    
    分解如下:

  • 定义最终“protoc”图像的第一个只读层,我们希望最终得到它。我选择Ubuntu是因为它是我在本地运行的。任何最小的Linux“基本映像”都可以,但它必须安装以下二进制文件:
    apt get
    wget
    解压
    rm
  • 来自ubuntu的

  • 使用
    --build arg=
    标志设置一些变量,用户可以在构建时使用docker build命令将这些变量传递给构建器:
  • ARG协议u版本=3.6.1

    ARG PROTOC\u TARGET=linux-x86\u 64

    ARG ASSET\u NAME=protoc-${protoc\u VERSION}-${protoc\u TARGET}.zip

  • 运行
    apt get-qy update
    以“从其源重新同步包索引文件”
    q
    忽略进度指标,
    y
    假设是,作为对遇到的任何提示的回答:
  • 运行apt get-qy更新

  • 安装PythonWget(从web服务器检索内容)和解压
  • 运行apt get-qy安装python wget解压

  • 删除作为前面步骤的一部分创建的所有文件(不再需要):
  • 运行rm-rf/var/lib/apt/lists/*

    前三条说明可合并为一条:

    运行apt-get-qy更新和apt-get-qy安装python wget解压和&rm-rf/var/lib/apt/lists/*

  • 使用该指令更新
    路径
    环境,以将
    协议
    二进制文件的位置包括在最终环境(图像)中
    ENV PATH=$PATH:/protoc/bin/

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

    ENTRYPOINT[“protoc”]

  • 使用说明,以便在运行
    protoc
    图像时,如果未提供任何选项,
    protoc--help
    将运行:
  • CMD[“--help]

    这就是我们需要定义一个可执行的
    protoc
    Docker映像的全部内容。但是,它还不是一个可以在环境中使用的映像。我们必须使用
    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
    ,可用于在中运行
    protoc
    。此自定义构建步骤的示例用法:

    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,因此,名称将引用人工制品: