Cloudfoundry VCAP_SERVICES 变量未提供给 django 的容器

Cloudfoundry VCAP_SERVICES variables are not supplied to container for django

我有一个 dockerized Django 应用程序,我想通过 cloudfoundry cli 实用程序将其部署在 SAP Cloud Platform 上。我添加了几个用户提供的服务以及他们自己的一组凭据。例如,我将 AWS S3 添加为用户提供的服务并为此提供了凭证。

现在这些凭据可以作为环境变量使用

VCAP_SERVICES={"user-provided":[{
  "label": "user-provided",
  "name": "s3",
  "tags": [
  ],
  "instance_name": "s3",
  "binding_name": null,
  "credentials": {
    "aws_access_key": "****",
    "aws_secret_key": "****",
    "bucket": "****",
    "region": "****",
    "endpoint": "*****"
  },
  "syslog_drain_url": "",
  "volume_mounts": [
  ]
}]}

我有 .env 文件,其中定义了变量,例如。 AWS_ACCESS_KEY。通常我将字符串值传递给变量,然后由我的应用程序使用。但是,鉴于我已经通过用户提供的服务机制对其进行了配置并且凭据已经存在,我想知道如何访问这些凭据。

有几种方法可以在 Python 应用程序中提取服务信息。

  1. 您可以使用 cfenv library 以编程方式完成此操作。您只需将此库集成到应用程序的启动中即可。这通常提供最大的灵活性,但有时可能难以与框架集成,具体取决于框架期望配置的输入方式。

  2. 您可以动态生成环境变量或配置文件,例如 .env 文件。这可以使用 .profile script 来完成。如果将 .profile 脚本放入您的应用程序的根目录中,它将在您的应用程序之前但在 运行 时间容器内执行。这使您可以在最后一刻调整应用程序的配置。

    .profile 脚本只是一个 shell 脚本,在其中,您可以使用 jqsed 等工具从 VCAP_SERVICES 环境变量并将该信息放在其他地方(可能是其他环境变量或放入 .env 文件)。

    因为您正在推送 Python 应用程序,所以 .profile 也可以执行 Python 脚本。 Python 构建包将 运行 并保证 Python 运行 时间在 PATH 上可用,供您的 .profile 脚本使用。因此你可以这样做,执行一个 Python 脚本。

    .profile 脚本:

    python $HOME/.profile.py
    

    .profile.py 脚本(这个名字随便起,随便起):

    #!/usr/bin/env python3
    print("Hello from python .profile script")
    

    您甚至可以从该脚本导入 Python 脚本中的库,这些库包含在您的 requirements.txt 文件中。