Google Cloud Run - запуск сценария оболочки в проекте firebase - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в облачном запуске Google, и я надеюсь добиться запуска скриптов в проекте firebase для обновления конфигураций (переменные env)

вот процесс

функция firebase invoked-> передать параметр (bar, baz) в облако run -> запустить скрипты firebase functions:config:set foo.bar=baz

Я создал образ инструментов firebase, совместно используемых сообществом разработчиков облачных вычислений, а ниже код

// cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/firebase', '.']
images:
- 'gcr.io/$PROJECT_ID/firebase'
tags: ['cloud-builders-community']

, а ниже - Dockerfile

//Dockerfile

FROM node

RUN npm i -g firebase-tools
ADD firebase.bash /usr/bin
RUN chmod +x /usr/bin/firebase.bash

ENTRYPOINT [ "/usr/bin/firebase.bash" ]

, так что отсюда мне было интересно, как писать и запускать скрипты. Любая идея или предложение будут оценены.

1 Ответ

2 голосов
/ 19 июня 2020

Cloud Run позволяет вам размещать контейнеры, которые отвечают на HTTP-запрос.

В вашем дизайне, как вам удалось вызвать свой контейнер? ... Да, у вас не определена никакая конечная точка.

Я участвовал в проекте с открытым исходным кодом и обнаружил инструмент, который автоматически bash использует скрипт в качестве конечной точки http. Взгляните на этот Dockerfile . Он использует инструмент shell2http

В вашем случае я рекомендую вам иметь такой Dockerfile:

FROM node
RUN npm i -g firebase-tools
ADD my_script.sh /
COPY --from=msoap/shell2http /app/shell2http /shell2http

RUN chmod +x my_script.sh

ENTRYPOINT ["/shell2http","-export-all-vars"]
CMD ["/update","/my_script.sh"]

Напишите свой my_script.sh для запуска bash команда, которую вы хотите в соответствии с параметрами запроса.

Пример работы my_script.sh

#!/bin/sh
firebase --version

И после создания вашего контейнера и его развертывания в Cloud Run вызовите https://myservice.....run.app/update?<your env var>

РЕДАКТИРОВАТЬ

Для аутентификации Firebase у вас есть 2 решения, но, прежде чем вдаваться в подробности, вы должны сгенерировать свой токен refre sh, как описано здесь

  1. Используйте env var для передачи вашего токена. Это не самый безопасный вариант, потому что ваш токен находится в виде обычного текста в окружении Cloud Run.

Разверните свой сервис следующим образом

gcloud run deploy --image=... --set-env-vars=TOKEN=<tokenValue>

И создайте свой my_script.sh файл, например это

#!/bin/sh
firebase --token $TOKEN <command>
Используйте секретный менеджер . Это более безопасно, но требует большего. Начните с сохранения токена firebase refre sh в секретном менеджере
echo "<tokenContent>" | gcloud beta secrets create --replication-policy=automatic --data-file=- myFirebaseToken

Я изменил способ создания контейнера, потому что мне нужно использовать gcloud. Таким образом, здесь новый контейнер

FROM google/cloud-sdk

RUN apt-get update && apt-get install -y nodejs npm
RUN echo $(npm i -g  firebase-tools)
RUN node -v

ADD my_script.sh /
COPY --from=msoap/shell2http /app/shell2http /shell2http
RUN chmod +x my_script.sh

ENTRYPOINT ["/shell2http","-export-all-vars"]
CMD ["/update","/my_script.sh"]

2 примечания:

  • Версия узла по умолчанию - 12. Я не знаю, является ли это проблемой для вас
  • Версия узла 12 является проблемой для инструментов firebase, потому что одна зависимость устарела. И команда npm i завершается с ненулевым кодом (и сборка не удалась). Хакерство здесь заключается в том, чтобы окружить команду эхо RUN echo $(npm i -g firebase-tools). Не совсем чисто, но работает.

А теперь my_script.sh файл

#!/bin/sh
TOKEN=$(gcloud beta secrets versions access --secret=<mySecretToken> latest)
firebase --token $TOKEN <command>
...