gcloud app deploy '--appyaml' 标志似乎不起作用

gcloud app deploy '--appyaml' flag doesn't seem to work

对于 Google App Engine,我想在部署时将 env_variables 注入到我的 app.yaml 中。在 gcloud app deploy 的文档中,我看到有标志 --appyaml 将:

Deploy with a specific app.yaml that will replace the one defined in the DEPLOYABLE.

https://cloud.google.com/sdk/gcloud/reference/app/deploy

所以我有一个 Fabric 脚本读取我的 app.yaml,注入我的额外环境变量,将这个新的 app.yaml 写入临时文件,然后运行 ​​gcloud app deploygcloud 的命令最终看起来像这样:

gcloud app deploy . --version dev --project myproject --appyaml='/var/folders/1z/qk45g9p934lg75byl8b74xyh0000gn/T/tmpgdjVUG.yaml'

部署成功并上传了新代码,但我的新环境变量似乎无法弥补。

如果我向 --appyaml 提供虚假值,那么它会抛出错误,因此它似乎确实使用了我的输入。

知道我可能做错了什么吗?

我已经在标准 AppEngine 上测试了它,在 node.JS 中进行了小 HelloWorld 修改,如下所示:

'use strict';

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    var my_respond = "variables: ";
    res.status(200).send(Object.entries(process.env)).end();
});

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

module.exports = app;

示例显示环境变量作为结果。

比我加的最简单app.yaml:

runtime: nodejs10
env_variables:
  MY_VAR: "my value from app.yaml"

与其他位置相比,我添加了不同的 yaml,称为 app1.yaml:

runtime: nodejs12
env_variables:
  MY_VAR: "my value from app1.yaml"

所以这是在更改节点版本和 MY_VAR 的值。

根据我的测试,这似乎与文档中解释的有点不同,至少我理解不同。

可以使用--appyaml 标志,但前提是目录中没有app.yaml 文件。如果您在应用程序目录中没有它,则可以使用标志指向不同的 yaml.

因此,当我尝试使用 gcloud app deploy --appyaml="/home/vitooh/app1.yaml" 进行部署并且 app.yaml 在应用程序目录中时,应用程序是使用它进行部署的 - 因此该标志不会执行任何操作。然而,当我在没有 app.yaml 的情况下完成时,标志有效,变量值被更改。

实际上你可以在提交命令后发现它,那里有一个显示的摘要,就在你确认部署之前,在 descriptor 中的值是这样的:

descriptor:      [/home/vitooh/app1.yaml]
source:          [/home/vitooh/appEngine/nodejs-docs-samples/appengine/hello-world/standard]
target project:  [xxxxx-test-01]
target service:  [default]
target version:  [20200819t094956]
target url:      [https://xxxxx-test-01.appspot.com]

Do you want to continue (Y/n)?

问题是一个没有任何细节的黑匣子:“我有一个 fabfile,然后事情发生了,但它们发生了错误”。然而,这里有一个提示,如何在不弄乱 app.yaml 的情况下更简单地完成此操作。 app.yaml 可以包含一个名为 includes 的指令,它可以引用另一个 yaml 文件,您可以在其中拥有环境变量,因此您不必触及原始文件。

app.yaml:

(...)

includes:
  - my_vars.yaml

my_vars.yaml:

env_variables:
    MY_VAR: value