Как использовать подключаемый модуль gRPC Python с Docker и Google Cloud Builds?

TL, DR;

  • Какой образ Linux Docker будет самым быстрым / легким для запуска подключаемого модуля Python gRPC при создании файлов дескриптора API?
  • Должен ли вышеупомянутый дескриптор API стать Cloud Build артефакт и сохранен в Cloud Storage Bucket?
    • ... чтобы использовать gcloud для развертывания API на конечных точках облака.

Деталь

Я запускаю Служба Python gRPC и ESP в контейнерах Docker, работающих на Google Compute Engine. О gRPC> Управление API показывает диаграмму архитектуры моего приложения:

Как использовать подключаемый модуль gRPC Python с Docker и Google Cloud Builds?

Мои этапы сборки высокого уровня:


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 должен включать:

  • Сгенерированный код gRPC из шага 3).
  • Любые дополнительные пакеты Python, необходимые для сервера gRPC.

Шаг 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 и сохранить в бакете облачного хранилища.

  • Какой образ Linux Docker будет самым быстрым / легким для запуска подключаемого модуля Python gRPC при создании файлов дескриптора API?
  • Должен ли вышеупомянутый дескриптор API стать Cloud Build артефакт и сохранен в Cloud Storage Bucket?
    • ... чтобы использовать gcloud для развертывания API на конечных точках облака.

🤔 А знаете ли вы, что...
С Python можно создавать роботов и автоматизированные системы с использованием библиотеки Raspberry Pi.


5
2 211
1

Ответ:

Решено

Я получил эту работу несколько месяцев назад. Не знаю, правильно ли я сделал. Судите сами: p

TL, DR; Если вы просто хотите использовать protoc с Google Cloud Build, я отправил конструктор protoc в репозиторий GitHub сообщества облачных разработчиков, который был принят. См. Сообщество разработчиков облаков / протокол.

Деталь; Мое решение основано на создании protocПользовательский шаг сборки. Это создает образ контейнера Docker, который рабочий Cloud Build извлекает и запускает, когда ему нужно запустить protoc.

Вам нужно всего два файла для создания Пользовательский шаг сборки, 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. Определите первый слой только для чтения финального «протокольного» изображения, которым мы хотим закончить. Я выбрал Ubuntu, потому что это то, что я запускаю локально. Подойдет любой минимальный «базовый образ» Linux, но в нем должны быть установлены следующие двоичные файлы: apt-get, wget, unzip и rm:

FROM ubuntu

  1. Настройте некоторые переменные, которые пользователи могут передавать во время сборки сборщику с помощью команды docker build, используя флаг --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

  1. Запустите apt-get -qy update, чтобы «повторно синхронизировать индексные файлы пакетов из их источников». q опускает индикаторы прогресса, y предполагает «да» в качестве ответа на любые возникающие подсказки:

RUN apt-get -qy update

  1. Установите Python, Wget (получает контент с веб-сервера) и Разархивировать.

RUN apt-get -qy install python wget unzip

  1. Удалите все файлы, созданные на предыдущих шагах (и которые больше не нужны):

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/*

  1. Используйте инструкцию ENV, чтобы обновить среду PATH, чтобы включить расположение двоичного файла protoc в окончательной среде (образ).

ENV PATH=$PATH:/protoc/bin/

Установите ТОЧКА ВХОДА образа так, чтобы образ работал как исполняемый файл protoc. Нет, поскольку на предыдущем шаге protoc был добавлен к $PATH, нам нужно только указать исполняемый двоичный файл (а не полный путь):

ENTRYPOINT ["protoc"]

  1. Используйте инструкцию CMD, чтобы, если при запуске образа 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.