Уточнение Node.js версия для Google Cloud App Engine Гибкая

# #node.js #google-app-engine #google-cloud-platform #google-cloud-build #app-engine-flexible

Вопрос:

Я пытаюсь развернуть гибкий сервис GCloud App Engine. У меня есть файл yaml, в котором есть Node.js время выполнения и env указанное.

 runtime: nodejs
env: flex
 

Как говорится в документации, «Вы можете указать другое Node.js версия в файле package.json вашего приложения с помощью поля двигатели»., Я также добавил следующее в package.json :

 "name": "@bindr/dev",
"version": "1.0.0",
"engines": {
  "node": ">=14.0.0"
},
 

Однако, когда я запускаю gcloud app deploy , я получаю следующую ошибку:

 error @bindr/dev@1.0.0: The engine "node" is incompatible with this module. Expected version ">=14.0.0". Got "12.19.0"
 

Похоже, что процесс развертывания не учитывает engines свойство, потому что даже если я укажу неверную версию (например >=18.0.0 ), она все равно не будет жаловаться, только yarn install сбой. Как я могу заставить процесс сборки использовать указанную версию узла?

Я обнаружил, что могу указать версию узла cloudbuild.yaml для определенных этапов сборки, например:

 steps:
  - name: node:node-14.10.0
    args: ['predeploy.js', 'content-server']
  - name: 'gcr.io/cloud-builders/yarn:node-14.17.1'
    args: ['install']
  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['app', 'deploy']
timeout: '900s'
 

В этом процессе yarn install шаг выполняется успешно, но gcloud app deploy шаг все равно завершается неудачно при попытке установить зависимости (я не смог найти, как я мог бы указать версию узла gcr.io/cloud-builders/gcloud , похоже, это не такой тег).

Я также проверил, и та же 12.19.0 версия работает на рабочих экземплярах, так что не только среда сборки имеет более старую версию.

Что я делаю не так?

Комментарии:

1. Попробуйте развернуть с yarn install --ignore-engines помощью и дайте мне знать, если это сработает

2. Вероятно, он будет построен , но я проверил, и версия узла на экземпляре есть 12.19.0 , и, например node-fetch , требуется последняя >=12.20.0 версия . Я бы не стал использовать версию узла в производстве, которая официально не поддерживается пакетом (даже если кажется, что она работает).

3. Хотя почему -1? Это законная проблема, и я подробно рассказал о многих вещах, которые я уже выяснил. Должен ли я был написать где-нибудь в другом месте?

4. Можете ли вы попытаться удалить спецификацию версии узла из раздела package.json Движка? Это работает?

5. Я попробовал. Он успешно строится, но когда я подключаюсь по SSH к экземпляру и проверяю версию узла, все равно говорится v12.19.0 .

Ответ №1:

Я столкнулся с той же проблемой и создал проблему для нее здесь. Я подозреваю, что это ошибка в движке приложений Google, а не в вашем приложении.

В качестве обходного пути я в конечном итоге использовал пользовательскую среду выполнения для своего приложения. Для этого в файле конфигурации GAE вы переключаетесь с runtime: nodejs на runtime: custom и добавляете файл Dockerfile в корневой каталог проекта. Здесь есть хорошие документы по написанию док-файла, но вот простой, который вы можете использовать:

 # syntax=docker/dockerfile:1

FROM node:14.10.0
ENV NODE_ENV=production

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . .

CMD [ "node", "server.js" ]
 

Вероятно, вам также понадобится .dockerignore файл, который, по крайней мере, содержит node_modules .

В конечном счете, я думаю, что исправление GAE было бы лучше, так как было бы проще просто настроить версию вашего узла package.json , как вы должны уметь. Но этого должно быть достаточно, чтобы заставить все работать и обойти то, что кажется ошибкой GAE.

Ответ №2:

Чтобы завершить это, как упоминал @CharlieA, в гибкой среде App Engine есть изображение по умолчанию для Node.js которая в настоящее время является версией 12.19.01.

Как отметил @Cleanbeans, согласно документам среды Flex, среда выполнения для Node.js следует указать в app.yaml as runtime: nodejs , unile на других языках, где вы можете указать номер версии. Это объясняет, почему движок возвращал версию по умолчанию, несмотря на указание версии 14.

Возвращаясь к комментарию @CharlieA, скажу, что это можно исправить, используя пользовательскую среду выполнения в вашем app.yaml примере следующим образом: runtime: custom .

В качестве альтернативы попробуйте использовать исправленную версию в своем package.json , как обсуждается в этой теме Github.

Помимо упомянутой выше темы Github, @CharlieA также создала общедоступный трекер проблем для Google, чтобы просмотреть это. Возможно, вам захочется запросить обновление документации, в котором будет подробно описано, как указать Node.js версия в гибкой среде.

Комментарии:

1. Указание фиксированной версии среды выполнения для меня тоже не сработало. Я думаю, что тема GitHub немного отличается от того, что мы обсуждаем здесь.

Ответ №3:

Так что взгляните на этот документ, уделив особое внимание этой строке

Двигатели.свойство узла является необязательным, но если оно присутствует, значение должно быть совместимо с Node.js версия, указанная в вашем файле app.yaml. Например:

Я полагаю, что версия по умолчанию-12 (т. Е. runtime: nodejs ), чтобы исправить это в вашей app.yaml среде выполнения набора файлов следующим образом runtime: nodejs14 или новее

Также имейте в виду, что незначительные исправления обновляются автоматически, поэтому вы можете указать только основную версию, т. е. 14.X.X. Кроме того, если указанная вами версия недоступна, процесс сборки завершится неудачно.

Примечание.Если вы используете облачную сборку cloudbuild.yaml и гибкую среду, вы можете получить ошибку сборки, переместитесь cloudbuild.yaml в ее собственную папку, чтобы предотвратить эту ошибку, и используйте параметр —config для указания местоположения yaml. Смотрите этот документ для получения дальнейших указаний

Комментарии:

1. Спасибо за ваш ответ. Я считаю nodejs14 , что значение runtime только для стандарта App Engine. Но, чтобы быть уверенным , я также попытался изменить это, обновил engines.node 14.x , даже переустановил локальный узел, чтобы он был последним v14 , и получил ERROR: (gcloud.app.deploy) Your application does not satisfy all of the requirements for a runtime of type [nodejs14]. . После изменения среды выполнения обратно на nodejs , это дало мне ту же ошибку error @bindr/dev@1.0.0: The engine "node" is incompatible with this module. Expected version "14.x". Got "12.19.0"

2. У меня были похожие проблемы с Firebase . Иногда api GCloud кэширует определенные атрибуты для последующего их использования. Я помню Firebase Deploy , что это произвело на меня похожий эффект. Я думаю, что мне пришлось удалить все кэшированные файлы, относящиеся к Firebase, чтобы решить эту проблему. Попробуйте, по крайней мере, выйти из GCloud SDK системы и снова войти в нее. Это может быть просто простой проблемой.

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