[英]Specifying Node.js version for Google Cloud App Engine Flexible
我正在嘗試部署 GCloud App Engine 靈活服務。 我有一個 yaml 文件,其中包含 Node.js 運行時和指定的env
。
runtime: nodejs
env: flex
正如文檔所說“您可以使用engines 字段在應用程序的package.json 文件中指定不同的Node.js 版本。”,我還在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
失敗。 如何讓構建過程使用指定的 Node 版本?
我發現我可以在cloudbuild.yaml
為構建的某些步驟指定 Node 的版本,如下所示:
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
版本正在生產實例上運行,因此不僅僅是構建環境具有舊版本。
我究竟做錯了什么?
所以看看這個文檔,特別注意這一行
engine.node 屬性是可選的,但如果存在,該值必須與 app.yaml 文件中指定的 Node.js 版本兼容。 例如:
我相信默認版本是 12(即runtime: nodejs
)以在您的app.yaml
文件集運行時更正此問題,如下runtime: nodejs14
或更高版本
另請記住,次要補丁會自動更新,因此您只能指定主要版本,即 14.XX。此外,如果您指定的版本不可用,則構建過程將失敗。
注意:如果您使用帶有cloudbuild.yaml
和 flex 環境的雲構建,您可能會遇到構建錯誤,請將cloudbuild.yaml
移動到其自己的文件夾中以防止出現此錯誤,並使用 --config 選項來說明 yaml 的位置。 請參閱此文檔以獲取進一步指導
我遇到了同樣的問題並在這里創建了一個問題。 我懷疑這是 Google App Engine 的錯誤,而不是您的應用程序的錯誤。
作為一種解決方法,我最終為我的應用程序使用了自定義運行時。 為此,在您的 GAE 配置文件中,您從runtime: nodejs
切換到runtime: custom
並將 Dockerfile 添加到您的項目根目錄。 有上寫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" ]
您可能還需要一個至少包含node_modules
的.dockerignore
文件。
最終,我認為 GAE 修復會更好,因為在package.json
配置您的節點版本會更簡單,就像您應該能夠做到的那樣。 但這應該足以讓事情正常工作並避開似乎是 GAE 錯誤的東西。
總結一下,正如@CharlieA 所提到的,App Engine Flex 環境有一個 Node.js 的默認圖像,目前版本為12.19.01 。
正如@Cleanbeans 指出的,根據Flex 環境文檔,Node.js 的運行時應在app.yaml
指定為runtime: nodejs
,unile 其他語言,您可以在其中指定版本號。 這解釋了為什么盡管指定了版本 14,但引擎仍返回默認版本。
回到@CharlieA 評論,這可以通過在app.yaml
使用自定義運行時來修復,如下所示: runtime: custom
。
或者,嘗試在你的package.json
使用一個固定版本,正如這個Github thread 中所討論的那樣。
除了上面提到的 Github 線程之外,@CharlieA 還創建了一個公共問題跟蹤器供 Google 審查。 您可能需要請求文檔更新,詳細說明如何指定 Node.js 版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.