TL, DR;
gcloud
для развертывания API на конечных точках облака.Деталь
Я запускаю Служба Python gRPC и ESP в контейнерах Docker, работающих на Google Compute Engine. О gRPC> Управление API показывает диаграмму архитектуры моего приложения:
Мои этапы сборки высокого уровня:
1) Создайте файл дескриптора, 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)Сгенерировать код gRPC с использованием плагина Python:
python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto
4) Создайте окончательный образ Docker для развертывания на Google Compute Engine. Полученный образ Docker должен включать:
Шаг 4) создает «сервер gRPC» (крайнее правое синее поле на прилагаемой диаграмме), используя следующий файл Docker:
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 Облачная сборка.
AFAICT мои этапы сборки высокого уровня должны отображаться на Cloud Builder официальные изображения строителя.
1) ???
2) Используйте облачные конструкторы / gcloud / для запуска команд gcloud
.
3) ???
4) Используйте облачные конструкторы / докеры для создания образа Docker «gRPC Server».
На этапах 2) и 3) уже доступны построители облака (см. GoogleCloudPlatform / облачные разработчики).
Однако я не знаю, как перенести шаги 1) и 3) в Cloud Build. Оба шага требуют запуска подключаемого модуля Python, который недоступен в базовом образе Linux Docker.
Шаг 1 AFAICT) должен создать Cloud Build артефакт для api_descriptor.pb
и сохранить в бакете облачного хранилища.
gcloud
для развертывания API на конечных точках облака.🤔 А знаете ли вы, что...
С Python можно создавать роботов и автоматизированные системы с использованием библиотеки Raspberry Pi.
Я получил эту работу несколько месяцев назад. Не знаю, правильно ли я сделал. Судите сами: p
TL, DR; Если вы просто хотите использовать protoc
с Google Cloud Build, я отправил конструктор protoc
в репозиторий GitHub сообщества облачных разработчиков, который был принят. См. Сообщество разработчиков облаков / протокол.
Деталь; Мое решение основано на создании protoc
Пользовательский шаг сборки. Это создает образ контейнера Docker, который рабочий Cloud Build извлекает и запускает, когда ему нужно запустить 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]
Разбивая это:
apt-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 apt-get -qy update && apt-get -qy install python wget unzip && rm -rf /var/lib/apt/lists/*
PATH
, чтобы включить расположение двоичного файла protoc
в окончательной среде (образ).ENV PATH=$PATH:/protoc/bin/
Установите ТОЧКА ВХОДА образа так, чтобы образ работал как исполняемый файл protoc
. Нет, поскольку на предыдущем шаге protoc
был добавлен к $PATH
, нам нужно только указать исполняемый двоичный файл (а не полный путь):
ENTRYPOINT ["protoc"]
protoc
не указаны параметры, запускался protoc --help
:CMD ["--help]
Это все, что нам нужно для определения исполняемого образа protoc
Docker. Однако это еще не Пользовательский шаг сборки, который можно использовать в среде Сборка Google Cloud. Мы должны определить шаг пользовательской сборки с помощью 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
в Google 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 идентификатором вашего проекта, поэтому имя будет ссылаться на артефакт: 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.