问题描述
对于Google App Engine,我想在部署后将env_variables
注入我的app.yaml
中。在gcloud app deploy
的文档中,我看到有标记--appyaml
将:
使用特定的app.yaml进行部署,它将替换DEPLOYABLE中定义的app.yaml。
https://cloud.google.com/sdk/gcloud/reference/app/deploy
因此,我有一个Fabric脚本,该脚本读取我的app.yaml
,注入我的额外env变量,将此新app.yaml写入临时文件,然后运行gcloud app deploy
。 gcloud
的命令最终看起来像这样:
gcloud app deploy . --version dev --project myproject --appyaml='/var/folders/1z/qk45g9p934lg75byl8b74xyh0000gn/T/tmpgdjVUG.yaml'
部署成功并且上传了新代码,但是我的新env变量似乎没有弥补。
如果我为--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