【发布时间】:2021-07-15 21:09:04
【问题描述】:
我将 Web 应用程序部署到本地 cloudfoundry 环境。作为我的 DEV 环境的数据库服务,我选择了市场服务google-cloudsql-postgres,计划为postgres-db-f1-micro。我使用 Web UI 创建了一个名为 myapp-test-database 的实例,并在 CF Manifest 中提到了它:
applications:
- name: myapp-test
services:
- myapp-test-database
起初,一切都很好。我什至可以重新部署现有的工件。但是,当我构建我的应用程序的新版本并将其推送到 CF 时,注入的凭据会更新,并且应用程序无法再访问表:
PSQLException: ERROR: permission denied for table
这些表仍然存在,但归前一个用户所有。它们是由 public 架构中的 ORM 自动创建的。
虽然 -OLD 应用程序仍然存在,但我可以从 CF Web UI 或 $VCAP_SERVICES 检索旧用户名/密码并删除表。
这一切都是因为滚动应用部署吗?但是接下来应该会有很多抱怨。
【问题讨论】:
-
如果您严格执行
cf push(或重新启动/重新暂存),则不涉及代理(云控制器不与它对话),因此如果您的凭据发生变化,它会发生在 CF 发生的事情之外。通过cf可以修改您的凭据的唯一操作是执行unbind/bind。许多(但不是全部)服务代理将丢弃unbind上的凭据,并为bind提供新的、唯一的凭据。 -
While the -OLD application still exists-> 听起来您没有使用cf7中的滚动部署功能。该功能不使用两个应用程序,它在 CF 中使用不同的原语。如果您在 CF 中有两个不同的应用程序(即cf apps显示两个),则您必须有两个单独的绑定,这意味着两个单独的凭据。如果您需要两个应用程序具有相同的凭据,则可以改用服务密钥。服务键类似于绑定,但与应用程序无关。然后,您可以通过用户提供的服务或环境变量传递服务密钥凭据。 -
@DanielMikusa 是的,看起来我们使用的构建脚本模拟了滚动部署。您使用服务密钥的建议有帮助!我真的很失望 cf 不能像绑定服务那样向
$VCAP_SERVICES注入服务密钥凭据 -
这并不是服务密钥的真正意图。不支持 CF 的应用程序存在服务密钥,即不了解 VCAP_SERVICES,以及非 CF 部署的服务以使用 CF 上的服务(至少这是我的理解)。对于像这种情况这样的其他情况,它们可能很方便,但不是主要目的。如果您使用滚动部署,则不会有此限制。您还可以与您的服务提供商讨论共享用户的其他功能。
标签: postgresql google-cloud-sql cloud-foundry