为 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 版本。
我正在尝试部署 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 版本。