如何 运行 cloudfoundry 上的一次性任务在启动 Python 应用程序之前上传数据

how to run a one-off task on cloudfoundry to upload data before starting Python app

嗨,这是我第一次尝试使用 CF 在云上部署 Python 应用程序。我在部署我的应用程序时遇到问题;如果有人能帮助我或指出解决问题的正确方向,我将不胜感激。

主要问题是我尝试部署的应用程序由于大量 python 依赖项而变得很大。我的应用程序目录的大小是 200 Kb。我观察到的第一个错误是:Staging fails due to "Failed to upload payload for droplet" 。我认为原因是当所有 Python 依赖项都从 requirements.txt 文件下载并且最终创建了 Droplet 时,它的大小对于上传来说太大了。液滴大小=982。 3 MB

我尝试的第一个解决方案是 vendoring 应用程序,我在其中创建了一个包含所有 python 依赖项的供应商目录,但供应商目录的大小大于 1Gb,这导致上传大小超过 1Gb 限制并导致失败在上传应用文件中。

我正在处理的第二个解决方案是将所有已安装的 Python 库上传到对象存储(在我的例子中是绑定到我的应用程序的 S3 存储桶),然后将名为 Pypackages 的依赖项文件夹下载到应用程序的根目录:/home/vcap/app,所以我希望在我的应用程序在云端启动之前存在 /home/vcap/app/Pypackages。但是我还不能成功。我在我的应用程序目录中包含了一个 python 脚本,它成功地从 S3 存储桶下载文件。 (我已经在 downloadS3.py 脚本中放置了正确的下载绝对路径,即 /home/vcap/app/Pypackages)我想 运行 这个脚本使用“python downloadS3.py”作为一次性任务。首先,我在这里尝试了解决方案: 虽然我可以通过 '$cf tasks my-app-name' 看到任务的状态是 SUCCEED,但是 /home/vcap/app/Pypackages 不存在。

我也尝试过 运行 一次性任务,步骤如下:

1- $ cf push -c 'python downloadS3.py && sleep infinity' -i 1 --no-route

2- $ cf push -c 'null' 我在我的应用程序上打印了 /home/vcap/app 的内容,即当应用程序启动时,我在浏览器中输入 url (我不知道查看根目录内容的正确方法是什么).无论如何,问题是 Pypackages 没有下载到正确的根目录。我不确定我是否 运行 以错误的方式完成了一次性任务,或者是否有更好的解决方案可以让我的应用程序运行。 我感谢任何帮助! (已编辑)

Diego Cells 部署应用程序并通过云控制器将 Droplet 上传到 blobstore,可上传的最大文件可在 Ops Manager > TAS for VMs > Application Developer Control > Maximum File Upload Size (MB) 中配置,默认为 1024MB。似乎这造成了限制,如果您可以在管理员的帮助下增加它...

任务 运行 在他们自己的容器中,所以可能不是一个选项。我认为 Python buildpack 在创建 droplet 之前收集并安装包,所以不要认为将包直接复制到 /app 目录会有多大帮助。

如果您有数据文件,那么您可以使用 .profile 文件并执行一些脚本将它们从 S3 或 server/NFS 位置复制到 /app 目录中。像

wget http://s3.location.com/data_files
cp data_files /home/vcap/app/

但是如果所有这些都是包并且增加大小不可行,那么您可能需要考虑破坏应用程序..