Как развернуть приложение на Google Cloud Run
Google Cloud Run — это управляемая платформа вычислений, позволяющая запускать контейнеры на масштабируемой инфраструктуре Google.
Это руководство покажет, как использовать Docker для развертывания вашего приложения Deno на Google Cloud Run.
Сначала мы покажем, как развернуть приложение вручную, затем — как автоматизировать процесс с помощью GitHub Actions.
Предварительные условия:
- Аккаунт Google Cloud Platform
-
dockerCLI установлена -
gcloudустановлена
Развертывание вручную
Создание Dockerfile и docker-compose.yml
Для упрощения развертывания наше приложение будет простым файлом main.ts возвращающим строку в качестве HTTP-ответа:
import { Application } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
app.use((ctx) => {
ctx.response.body = "Hello from Deno and Google Cloud Run!";
});
await app.listen({ port: 8000 });
Затем, мы создадим два файла — Dockerfile и docker-compose.yml — для сборки Docker-образа.
В нашем Dockerfile, добавим:
FROM denoland/deno
EXPOSE 8000
WORKDIR /app
ADD . /app
RUN deno install --entrypoint main.ts
CMD ["run", "--allow-net", "main.ts"]
Затем, в нашем docker-compose.yml:
version: "3"
services:
web:
build: .
container_name: deno-container
image: deno-image
ports:
- "8000:8000"
Давайте протестируем это локально, запустив docker compose -f docker-compose.yml build, затем docker compose up, и перейдя по адресу localhost:8000.
Работает!
Настройка Artifact Registry
Artifact Registry — это частный реестр Docker-образов GCP.
Прежде чем использовать его, перейдите в GCP в Artifact Registry и нажмите «Создать хранилище». Вас попросят указать имя (deno-repository) и регион (us-central1). Затем нажмите «Создать».

Сборка, маркировка и отправка в Artifact Registry
После создания хранилища, мы можем начать отправку изображений в него.
Сначала добавим адрес реестра в gcloud:
gcloud auth configure-docker us-central1-docker.pkg.dev
Затем, соберем ваш Docker-образ. (Обратите внимание, что имя образа определено в нашем файле docker-compose.yml.)
docker compose -f docker-compose.yml build
Затем, пометьте его новым адресом Google Artifact Registry, хранилищем и именем. Имя образа должно соответствовать следующей структуре: {{ location }}-docker.pkg.dev/{{ google_cloudrun_project_name }}/{{ repository }}/{{ image }}.
docker tag deno-image us-central1-docker.pkg.dev/deno-app-368305/deno-repository/deno-cloudrun-image
Если вы не укажете метку, по умолчанию будет использоваться :latest.
Далее, отправьте образ:
docker push us-central1-docker.pkg.dev/deno-app-368305/deno-repository/deno-cloudrun-image
Подробнее о том, как отправлять и получать образы в Google Artifact Registry.
Ваш образ должен теперь отображаться в Google Artifact Registry!

Создание службы Google Cloud Run
Нам нужна среда для построения этих изображений, поэтому перейдите в Google Cloud Run и нажмите «Создать службу».
Давайте назовем ее "hello-from-deno".
Выберите «Развернуть одну версию из существующего образа контейнера». Используйте выпадающий список, чтобы выбрать изображение из deno-repository Artifact Registry.
Выберите «Разрешить запросы без аутентификации», а затем нажмите «Создать службу». Убедитесь, что порт равен 8000.
По завершении ваше приложение должно быть доступно:
Отлично!
Развертывание с помощью gcloud
Теперь, когда она создана, мы сможем развернуть приложение в этой службе с помощью gcloud CLI. Команда имеет следующий формат: gcloud run deploy {{ service_name }} --image={{ image }} --region={{ region }} --allow-unauthenticated. Обратите внимание, что имя image следует указанной выше структуре.
В этом примере команда имеет вид:
gcloud run deploy hello-from-deno --image=us-central1-docker.pkg.dev/deno-app-368305/deno-repository/deno-cloudrun-image --region=us-central1 --allow-unauthenticated
Успешно!
Автоматизация развертывания с помощью GitHub Actions
Для работы автоматизации необходимо убедиться, что созданы оба элемента:
- Google Artifact Registry
- Инстанс службы Google Cloud Run
(Если вы этого не сделали, обратитесь к предыдущему разделу.)
Теперь, когда это сделано, мы можем автоматизировать процесс с помощью GitHub workflow. Вот файл yaml:
name: Build and Deploy to Cloud Run
on:
push:
branches:
- main
env:
PROJECT_ID: { { PROJECT_ID } }
GAR_LOCATION: { { GAR_LOCATION } }
REPOSITORY: { { GAR_REPOSITORY } }
SERVICE: { { SERVICE } }
REGION: { { REGION } }
jobs:
deploy:
name: Deploy
permissions:
contents: "read"
id-token: "write"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Google Auth
id: auth
uses: "google-github-actions/auth@v0"
with:
credentials_json: "${{ secrets.GCP_CREDENTIALS }}"
- name: Login to GAR
uses: docker/login-action@v2.1.0
with:
registry: ${{ env.GAR_LOCATION }}-docker.pkg.dev
username: _json_key
password: ${{ secrets.GCP_CREDENTIALS }}
- name: Build and Push Container
run: |-
docker build -t "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.SERVICE }}:${{ github.sha }}" ./
docker push "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.SERVICE }}:${{ github.sha }}"
- name: Deploy to Cloud Run
id: deploy
uses: google-github-actions/deploy-cloudrun@v0
with:
service: ${{ env.SERVICE }}
region: ${{ env.REGION }}
image: ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.SERVICE }}:${{ github.sha }}
- name: Show Output
run: echo ${{ steps.deploy.outputs.url }}
Необходимые переменные среды (примеры в скобках относятся к этому репозиторию):
-
PROJECT_ID: ваш идентификатор проекта (deno-app-368305) -
GAR_LOCATION: расположение вашего Google Artifact Registry (us-central1) -
GAR_REPOSITORY: имя вашего Google Artifact Registry (deno-repository) -
SERVICE: имя вашей Google Cloud Run службы (hello-from-deno) -
REGION: регион вашей Google Cloud Run службы (us-central1)
Необходимые секретные переменные:
-
GCP_CREDENTIALS: это json-ключ учетной записи сервиса. При создании учетной записи сервиса убедитесь, что указаны необходимые роли и разрешения для Artifact Registry и Google Cloud Run.
Узнайте больше о развертывании на Cloud Run из GitHub Actions.
Для справки: https://github.com/google-github-actions/example-workflows/blob/main/workflows/deploy-cloudrun/cloudrun-docker.yml
© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/tutorials/google_cloud_run