Jac*_*ack 5 python docker google-cloud-platform gcloud google-cloud-build
TL,博士;
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
Run Code Online (Sandbox Code Playgroud)
2) 使用 gcloud 命令行工具部署 proto 描述符文件 ( api_descriptor.pb) 和配置文件:
gcloud endpoints services deploy api_descriptor.pb api_config.yaml
Run Code Online (Sandbox Code Playgroud)
3) 使用Python插件生成gRPC代码:
python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto
Run Code Online (Sandbox Code Playgroud)
4)构建最终的 Docker 镜像以部署在Google Compute Engine 上。生成的 Docker 映像应包括:
第 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
Run Code Online (Sandbox Code Playgroud)
我正在将这些构建步骤迁移到 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)应该产生一个云构建神器了api_descriptor.pb,并保存到云存储桶。
gcloud将 API 部署到 Cloud Endpoints。几个月前我就开始工作了。我不知道我是否以“正确”的方式做到了这一点。自己判断吧:p
\n\nTL,博士;如果您只想protoc与 Google Cloud Build 一起使用,我已向云构建器社区 GitHub 存储库protoc提交了一个构建器,该构建器已被接受。请参阅cloud-builders-community/protoc。
细节; 我的解决方案依赖于创建protoc Custom Build Step。这将创建一个 Docker 容器映像,供 Cloud Build 工作线程在需要运行时拉取并运行protoc。
您只需要两个文件来创建自定义构建步骤:protoc
cloudbuild.yaml- 告诉 Google Cloud Builder 如何构建 Docker 映像。Dockerfile- 告诉 Docker 如何构建包含protoc二进制文件的环境。这实际上是我实现步骤 1 的本地目录结构:
\n\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cloudbuild.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Dockerfile\nRun Code Online (Sandbox Code Playgroud)\n\nDocker 文件是protoc安装命令的位置,是两个文件中较复杂的一个:
FROM ubuntu\n\nARG PROTOC_VERSION=3.6.1\nARG PROTOC_TARGET=linux-x86_64\nARG ASSET_NAME=protoc-${PROTOC_VERSION}-${PROTOC_TARGET}.zip\n\nRUN apt-get -qy update && apt-get -qy install python wget unzip && rm -rf /var/lib/apt/lists/*\n\nRUN echo "${PROTOC_VERSION}/${ASSET_NAME}"\n\nRUN wget https://github.com/google/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-${PROTOC_TARGET}.zip && \\\nunzip ${ASSET_NAME} -d protoc && rm ${ASSET_NAME}\n\nENV PATH=$PATH:/protoc/bin/\nENTRYPOINT ["protoc"]\nCMD ["--help]\nRun Code Online (Sandbox Code Playgroud)\n\n分解一下:
\n\napt-get、wget、unzip和rm:FROM ubuntu
--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
apt-get -qy update“从源重新同步包索引文件”。q省略进度指示器,y假设对遇到的任何提示的回答是“是”:RUN apt-get -qy update
RUN apt-get -qy install python wget unzip
RUN rm -rf /var/lib/apt/lists/*
前面的三个RUN指令可以合并为一个:
\n\nRUN apt-get -qy update && apt-get -qy install python wget unzip && rm -rf /var/lib/apt/lists/*
PATH的位置。protocENV PATH=$PATH:/protoc/bin/
设置映像的ENTRYPOINT,以便映像作为protoc可执行文件运行。不,因为上一步添加protoc到$PATH,我们只需要指定要运行的二进制文件(而不是完整路径):
ENTRYPOINT ["protoc"]
protoc,protoc --help将运行:CMD ["--help]
这就是我们定义可执行protocDocker 镜像所需的全部内容。但是,它还不是可在Google 的 Cloud Build环境中使用的自定义构建步骤。我们必须使用定义自定义构建步骤cloudbuild.yaml:
steps:\n - name: \'gcr.io/cloud-builders/docker\'\n args:\n [\n \'build\',\n \'--tag\',\n \'gcr.io/$PROJECT_ID/protoc\',\n \'--cache-from\',\n \'gcr.io/$PROJECT_ID/protoc\',\n \'.\',\n ]\nimages: [\'gcr.io/$PROJECT_ID/protoc\']\nRun Code Online (Sandbox Code Playgroud)\n\n该文件将生成一个gcr.io/my-cloud-project-id/protoc可用于protoc在Google Cloud Build中运行的工件。此自定义构建步骤的示例用法:
steps:\n - name: \'gcr.io/$PROJECT_ID/protoc\'\n args:\n [\n \'--include_imports\',\n \'--include_source_info\',\n \'--proto_path\',\n \'.\',\n \'--descriptor_set_out\',\n \'api_descriptor.pb\',\n \'v1/my-api-proto.proto\',\n ]\nRun Code Online (Sandbox Code Playgroud)\n\nCloud 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 中运行。
| 归档时间: |
|
| 查看次数: |
2297 次 |
| 最近记录: |