Проблемы со сборкой и развертыванием контейнера Docker в Cloud Run

Несколько месяцев у меня работала пара сервисов Cloud Run. Однако вчера я попытался внести некоторые обновления в службу, и вдруг скрипты, которые я использовал с самого начала, больше не работают.

отправить сборку gcloud

Я использовал следующую команду для сборки моего проекта node/npm через удаленный контейнер докеров:

gcloud builds submit --tag gcr.io/PROJECT_ID/generator

У меня есть файл dockerfile и .dockerignore в том же каталоге, что и мой package.json, откуда я запускаю этот скрипт. Однако вчера я внезапно начал получать сообщение об ошибке, в котором говорилось, что при использовании параметра --tag требуется файл докеры, и образ не будет создан.

Предварительное решение

После некоторых исследований я попытался перенести свою сборку cnfig в файл gcloudbuild-staging.json, который выглядит так:

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": [
        "build",
        "-t",
        "gcr.io/PROJECT_ID/generator",
        "."
      ]
    }
  ]
}

И я изменил свой скрипт сборки на:

gcloud builds submit --config=./gcloudbuild-staging.json

После этого контейнер будет построен — насколько я могу судить. Вывод консоли выглядит так:

------------------------------------------------- REMOTE BUILD OUTPUT --------------------------------------------------
starting build "8ca1af4c-d337-4349-959f-0000577e4528"

FETCHSOURCE
Fetching storage object: gs://PROJECT_ID/source/1650660913.623365-8a689bcf007749b7befa6e21ab9086dd.tgz#1650660991205773
Copying gs://PROJECT_ID/source/1650660913.623365-8a689bcf007749b7befa6e21ab9086dd.tgz#1650660991205773...
/ [0 files][    0.0 B/ 22.2 MiB]                                                
/ [1 files][ 22.2 MiB/ 22.2 MiB]                                                
-
Operation completed over 1 objects/22.2 MiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon  785.4kB

Step 1/6 : FROM node:14-slim
14-slim: Pulling from library/node
8bd3f5a20b90: Pulling fs layer
3a665e454db5: Pulling fs layer
11fcaa1377c4: Pulling fs layer
bf0a7233d366: Pulling fs layer
0d4d73621610: Pulling fs layer
bf0a7233d366: Waiting
0d4d73621610: Waiting
3a665e454db5: Verifying Checksum
3a665e454db5: Download complete
bf0a7233d366: Verifying Checksum
bf0a7233d366: Download complete
8bd3f5a20b90: Verifying Checksum
8bd3f5a20b90: Download complete
0d4d73621610: Verifying Checksum
0d4d73621610: Download complete
11fcaa1377c4: Verifying Checksum
11fcaa1377c4: Download complete
8bd3f5a20b90: Pull complete
3a665e454db5: Pull complete
11fcaa1377c4: Pull complete
bf0a7233d366: Pull complete
0d4d73621610: Pull complete
Digest: sha256:9ea3dfdff723469a060d1fa80577a090e14ed28157334d649518ef7ef8ba5b9b
Status: Downloaded newer image for node:14-slim
 ---> 913d072dc4d9
Step 2/6 : WORKDIR /usr/src/app
 ---> Running in 96bc104b9501
Removing intermediate container 96bc104b9501
 ---> 3b1b05ea0470
Step 3/6 : COPY package*.json ./
 ---> a6eca4a75ddd
Step 4/6 : RUN npm ci --only=production
 ---> Running in 7e870db13a9b

> protobufjs@6.11.2 postinstall /usr/src/app/node_modules/protobufjs
> node scripts/postinstall

added 237 packages in 7.889s
Removing intermediate container 7e870db13a9b
 ---> 6a86cc961a09
Step 5/6 : COPY . ./
 ---> 9e1f0f7a69a9
Step 6/6 : CMD [ "node", "index.js" ]
 ---> Running in d1b4d054a974
Removing intermediate container d1b4d054a974
 ---> 672075ef5897
Successfully built 672075ef5897
Successfully tagged gcr.io/PROJECT_ID/generator:latest
PUSH
DONE
------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                                    IMAGES  STATUS
8ca1af4c-d337-4349-959f-0000577e4528  2022-04-22T20:56:31+00:00  31S       gs://PROJECT_ID/source/1650660913.623365-8a689bcf007749b7befa6e21ab9086dd.tgz  -       SUCCESS

В онлайн логах ошибок нет.

gcloud запустить развернуть

Вот код, который я использую для развертывания контейнера:

gcloud run deploy generator --image gcr.io/PROJECT_ID/generator --region=us-central1 --set-env-vars ENVIRONMENT=DEV

Вывод консоли для этого:

Deploying container to Cloud Run service [generator] in project [PROJECT_ID] region [us-central1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [generator] revision [generator-00082-kax] has been deployed and is serving 100 percent of traffic.
Service URL: https://generator-SERVICE_ID-uc.a.run.app

Ошибок в консоли запуска тоже нет. Он показывает развертывание, как будто все в порядке.

Эта проблема

Ничего не меняется. Локальный запуск этой службы с интерфейсным приложением, которое обращается к ней, дает успешные результаты. Однако моя промежуточная версия приложения, размещенная на Firebase, по-прежнему работает так, как если бы активна старая версия кода.

Что я пробовал

  • Я убедился, что тестирую и развертываю в одной и той же ветке git.
  • Я сделал несколько сборок и развертываний на случай, если произошла какая-то случайность.
  • Я пытался использовать команду gcloud для обновления трафика службы до последней версии.
  • Я убедился, что мое клиентское приложение использует правильный URL-адрес службы. Вроде ничего не изменилось, но на всякий случай скопировал/вставил

Мое последнее успешное развертывание было 19 марта 2022 года. С тех пор единственное, что я сделал, — это обновил все мои приложения WSL Linux, включая gcloud. Я не мог сказать, какую версию я использовал раньше, но сейчас я использую 38.0.0 интерфейса командной строки Google Cloud.

Я пытался найти свою проблему, но ничего подходящего не появилось. Я совершенно озадачен тем, почему все это перестало работать, и я не получаю никаких ошибок. Любые предложения или дополнительную информацию, которую я могу предоставить?

gcloud builds submit должен (!?) продолжать работать с --tag до тех пор, пока в папке, из которой вы запускаете команду, есть Dockerfile, или вы явно указываете исходную папку. Я не оспариваю, что вы получили сообщение об ошибке, но было бы полезно увидеть команду, которую вы использовали, и возникшую ошибку. Вам не нужно было переключаться на файл конфигурации сборки. Хотя проблема не в этом.

DazWilkin 23.04.2022 01:01

Использование latest в качестве значения тега является сложной задачей. Этот термин предполагает, что будет использоваться последняя версия образа контейнера, но происходит это довольно частонет. это особенно сложно, когда такой сервис, как Cloud Run, запускает изображение, помеченное latest, и разработчик просит запустить службу — то, что разработчик знает (!) — это другое изображение, но также помеченное latest. Что касается большинства служб, один и тот же тег означает одно и то же изображение, поэтому возможно (!) либо то, что Cloud Run не находит другое изображение или, либо вы не предоставляете ему другое изображение.

DazWilkin 23.04.2022 01:04

Мне неясно, какая альтернатива возникает, но я уверен, что использование вами latest вызывает некоторые из ваших проблем. Итак... для начала рассмотрите возможность использования системы, в которой каждый раз, когда вы создаете новый контейнер, вы помечаете его уникальным идентификатором. Обычный способ сделать это — использовать хэш фиксации (поскольку они меняются при каждой фиксации). В качестве альтернативы вы можете использовать дайджест контейнера (вместо тега) для ссылки на версию изображения. Для этого требуются ссылки на изображения в форме {IMG}@sha256:{HASH}.

DazWilkin 23.04.2022 01:07

Наконец, gcloud run теперь (всегда?) поддерживает развертывание из источника (папки) в работающую службу (он выполняет за вас процесс Cloud Build и развертывает результат в Cloud Run. Возможно, стоит использовать этот поток, чтобы сократить ваши шаги и, следовательно, возможность ошибки. См.: cloud.google.com/run/docs/развертывание исходного кода

DazWilkin 23.04.2022 01:09

@DazWilkin Изменение потока для использования этой универсальной команды привело к возможности увидеть фактическую ошибку сборки, так что, по крайней мере, это прогресс. У меня возникла проблема с попыткой использовать узел 18, поэтому я специально устанавливаю свой движок в файле package.json в надежде, что это будет единственная проблема. Спасибо за все советы; Меня тоже смутил файл dockerfile — команда, которую я изначально использовал, находится в моем посте, и она просто перестала работать.

Sabelyn 23.04.2022 03:47

@DazWilkin И это, наконец, работает! Огромное спасибо. Я был в бешенстве. Теперь... как мне отметить это как ответ...? -ковыряется-

Sabelyn 23.04.2022 03:53

Большой! Я опубликую свои комментарии как ответ

DazWilkin 23.04.2022 04:46
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
7
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

gcloud builds submit должен (!?) продолжать работать с --tag до тех пор, пока в папке, из которой вы запускаете команду, есть Dockerfile, или если вы явно указываете исходную папку.

Я не оспариваю, что вы получили сообщение об ошибке, но было бы полезно увидеть команду, которую вы использовали, и возникшую ошибку. Вам не нужно было переключаться на файл конфигурации сборки. Хотя проблема не в этом.

Использование latest в качестве значения тега является сложной задачей. Этот термин предполагает, что будет использоваться последняя версия образа контейнера, но происходит это довольно частонет. Это особенно сложно, когда такой сервис, как Cloud Run, запускает изображение, помеченное latest, и разработчик просит запустить службу — то, что разработчик знает (!) — это другое изображение, но также помеченное latest.

Что касается большинства служб, один и тот же тег означает одно и то же изображение, поэтому возможно (!) либо Cloud Run не находит другое изображение, либо вы не предоставляете ему другое изображение. Мне неясно, какая альтернатива возникает, но я уверен, что использование вами latest вызывает некоторые из ваших проблем.

Итак... для начала рассмотрите возможность использования системы, в которой каждый раз, когда вы создаете новый контейнер, вы помечаете его уникальным идентификатором. Обычный способ сделать это — использовать хэш фиксации (поскольку они меняются при каждой фиксации). В качестве альтернативы вы можете использовать дайджест контейнера (вместо тега) для ссылки на версию изображения. Для этого требуются ссылки на изображения в форме {IMG}@sha256:{HASH}.

Наконец, gcloud run теперь (всегда?) поддерживает развертывание из источника (папки) в работающую службу (он выполняет за вас процесс Cloud Build и развертывает результат в Cloud Run. Возможно, стоит использовать этот поток, чтобы сократить ваши шаги и, следовательно, возможность ошибки.

См.: Развертывание из исходного кода

Другие вопросы по теме