为 Google Cloud App Engine Flexible 指定 Node.js 版本

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 版本在生产实例上 运行ning,所以不仅仅是构建环境有旧版本。

我做错了什么?

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

The engines.node property is optional, but if present, the value must be compatible with the Node.js version specified in your app.yaml file. For example:

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

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

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

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

作为一种解决方法,我最终使用了 custom runtime for my app. To do this, in your GAE configuration file you switch from runtime: nodejs to runtime: custom and add a Dockerfile to your project root. There are good docs on writing a 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 错误。

总而言之,如@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 for Google to review this. You may want to request a documentation 更新,详细说明了如何在灵活环境中指定 Node.js 版本。