# #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. Спасибо за предложение. Я попытался отозвать доступ, затем снова войти в систему, я даже попытался развернуть его в другом проекте, но ничего из этого не сработало.