【问题标题】:Specifying Node.js version for Google Cloud App Engine Flexible为 Google Cloud App Engine Flexible 指定 Node.js 版本
【发布时间】:2021-11-20 10:20:11
【问题描述】:

我正在尝试部署 GCloud App Engine 灵活服务。我有一个 yaml 文件,其中指定了 Node.js 运行时和 env

runtime: nodejs
env: flex

正如文档所说“您可以使用引擎字段在应用程序的 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 版本正在生产实例上运行,因此不仅构建环境具有旧版本。

我做错了什么?

【问题讨论】:

  • 尝试使用yarn install --ignore-engines 进行部署,如果可行,请告诉我
  • 它可能会构建,但我检查了实例上的节点版本是12.19.0,并且,例如最新的node-fetch 需要>=12.20.0。我不会在生产中使用 Node 版本,该包不正式支持该版本(即使它似乎可以工作)。
  • 为什么是 -1 呢?这是一个合法的问题,我详细说明了许多我已经发现的事情。我应该在其他地方发帖吗?
  • 您可以尝试从package.json Engine 部分删除节点版本规范吗?有用吗?
  • 我试过了。它构建成功,但是当我 SSH 进入实例并检查节点版本时仍然显示v12.19.0

标签: node.js google-app-engine google-cloud-platform google-cloud-build app-engine-flexible


【解决方案1】:

我遇到了同样的问题并为它创建了一个问题here。我怀疑这是 Google App Engine 的错误,而不是您的应用程序的错误。

作为一种解决方法,我最终为我的应用使用了custom runtime。为此,在您的 GAE 配置文件中,您从 runtime: nodejs 切换到 runtime: custom 并将 Dockerfile 添加到您的项目根目录。关于编写 dockerfile here 有很好的文档,但这里有一个您可以使用的简单文档:

# 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 错误的问题。

【讨论】:

    【解决方案2】:

    总结一下,正如@CharlieA 提到的,App Engine Flex 环境有一个 Node.js 的默认图像,当前版本为12.19.01

    正如@Cleanbeans 所指出的,根据Flex environment docs,Node.js 的运行时应该在app.yaml 中指定为runtime: nodejs,统一其他可以指定版本号的语言。这解释了为什么尽管指定了版本 14,但引擎仍返回默认版本。

    回到@CharlieA 评论,这可以通过使用app.yaml 中的自定义运行时来修复,如下所示:runtime: custom

    或者,尝试在您的package.json 中使用固定版本,正如Github thread 中所讨论的那样。

    除了上面提到的 Github 线程,@CharlieA 还创建了一个Public Issue tracker 供 Google 审核。您可能需要请求 documentation 更新,详细说明如何在灵活环境中指定 Node.js 版本。

    【讨论】:

    • 指定一个固定的运行时版本对我也不起作用。我认为 GitHub 线程与我们在这里讨论的问题略有不同。
    【解决方案3】:

    所以看看这个doc,特别注意这一行

    engines.node 属性是可选的,但如果存在,该值必须与 app.yaml 文件中指定的 Node.js 版本兼容。例如:

    我相信默认版本是 12(即runtime: nodejs),以便在您的app.yaml 文件集运行时中更正此问题,如下runtime: nodejs14 或更新版本

    还请记住,次要补丁会自动更新,因此您只能指定主要版本,即 14.X.X。此外,如果您声明的版本不可用,则构建过程将失败。

    注意:如果您使用带有 cloudbuild.yaml 和 flex 环境的云构建,您可能会遇到构建错误,请将 cloudbuild.yaml 移动到其自己的文件夹中以防止出现此错误并使用 --config 选项来说明yaml。如需进一步指导,请参阅this doc

    【讨论】:

    • 感谢您的回答。我相信runtimenodejs14 值仅适用于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"
    • Firebase 也遇到过类似的问题。有时 GCloud api 会缓存某些属性以供以后使用。我记得Firebase Deploy 对我有类似的效果。我想我必须删除任何与 Firebase 相关的缓存文件才能解决这个问题。至少尝试注销GCloud SDK 并重新登录。这可能只是一个简单的问题。
    • 感谢您的建议。我尝试撤销访问权限,然后再次登录,甚至尝试将其部署到不同的项目,但这些都不起作用。
    猜你喜欢
    • 2017-10-09
    • 2019-07-10
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2017-12-07
    • 2018-03-29
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多