如何在Docker和Google Cloud构建中使用gRPC Python插件?
TL,DR强>如何在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
- 在生成API描述符文件时,哪个Linux Docker映像运行Python gRPC插件最快/最轻
- 上述API描述符是否应该成为云构建并保存到云存储桶中?
- …以便使用
将API部署到云端点李>gcloud
- …以便使用
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描述符是否应该成为云构建并保存到云存储桶中?
- …以便使用
将API部署到云端点李>gcloud
- …以便使用
protoc
,我已经向已被接受的提交了一个protoc
builder。看
细节我的解决方案依赖于创建协议
。这将创建一个Docker容器映像,云构建工作人员将在需要运行protoc
时提取并运行该映像
您只需要两个文件即可创建,protoc
:
cloudbuild.yaml
-告诉Google Cloud Builder如何构建Docker映像Dockerfile
-告诉Docker如何构建包含protoc
二进制文件的环境.
├── 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]
分解如下:
apt get
、wget
、解压
和rm
:
--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更新
运行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,因此,名称将引用人工制品: