Heroku 神秘的临时文件系统不允许我从 S3 获取文件

The Mystical Ephemeral File System of Heroku is Not Letting Me Get Files from S3

所以,几天来我一直在为这个问题苦苦思索...我需要从 S3 获取一个文件并将其写入我在 Heroku 上的 Rails 应用程序中的一个目录。 我一定是对 Heroku 上的临时文件系统有误解,因为我不明白为什么它不起作用。

我正在 运行宁 s3.bucket('bucket').object('file.csv').get(response_target: 'file.csv') 从 S3 获取文件并将其写入我的应用程序。最初我只是写了一个 .rb 来做到这一点, 运行 它使用 Heroku Scheduler,但无济于事。然后,我将脚本变成了 rake 任务,运行 在 scheduler 上,再次无济于事。我能够在我的开发环境中完美地 运行 .rb 脚本和 rake 任务。

阅读 this and this 临时文件系统的工作原理后,我认为该任务实际上正在运行,但文件被破坏了(或者实际上存在但我不能看到了吗?)当我在 heroku run bash.

中使用 ls

有人可以解释一下我这是怎么回事吗?如果我从 S3 获取文件并写入我在 Heroku 上的应用程序的努力是徒劳的?如果还有其他选择?

如果我在这之后无法解决,那么我将在 EC2 中设置我自己的环境。

使用 Heroku,您没有一个应用程序 运行ning,而是有几个 dynos 每个应用程序都有一份代码副本和 运行ning 应用程序的某些方面,并且彼此独立。特别是每个 dyno 的文件系统与其他文件系统是分开的。

在你的情况下,你推送你的应用程序,这会创建一个(或更多)网络测功机,运行你的 Rails 应用程序 – 处理网络请求。

您还有一个计划任务使用 Heroku Scheduler that downloads the file. When this runs a new one-off dyno 创建并将文件下载到该 dyno 的文件系统中。任务完成后,dyno 和下载的文件将被丢弃。

当您 运行 heroku run bash 您创建了另一个一次性 dyno,显然该文件不在该 dyno 的文件系统中。

解决方案将完全取决于您要尝试做什么,但一个建议是将文件中的数据放入您的数据库中,以便其他测功机可以轻松访问它。