Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Heroku神秘而短暂的文件系统不允许我从S3获取文件_Ruby On Rails_Ruby_Amazon Web Services_Heroku_Amazon S3 - Fatal编程技术网

Ruby on rails Heroku神秘而短暂的文件系统不允许我从S3获取文件

Ruby on rails Heroku神秘而短暂的文件系统不允许我从S3获取文件,ruby-on-rails,ruby,amazon-web-services,heroku,amazon-s3,Ruby On Rails,Ruby,Amazon Web Services,Heroku,Amazon S3,因此,我已经为这个问题绞尽脑汁好几天了……我需要从S3获取一个文件,并将其写入Heroku上Rails应用程序的目录。我一定对Heroku上的临时文件系统有误解,因为我不明白它为什么不工作 我正在运行s3.bucket('bucket').object('file.csv').get(response_target:'file.csv')从s3获取文件并将其写入我的应用程序。最初,我只是编写了一个.rb来执行此操作,并使用Heroku调度程序运行它,但没有效果。然后,我将脚本转换为一个rake任

因此,我已经为这个问题绞尽脑汁好几天了……我需要从S3获取一个文件,并将其写入Heroku上Rails应用程序的目录。我一定对Heroku上的临时文件系统有误解,因为我不明白它为什么不工作

我正在运行
s3.bucket('bucket').object('file.csv').get(response_target:'file.csv')
从s3获取文件并将其写入我的应用程序。最初,我只是编写了一个
.rb
来执行此操作,并使用
Heroku调度程序运行它,但没有效果。然后,我将脚本转换为一个rake任务,并在
调度程序上运行该任务,同样没有效果。我能够在我的开发环境中完美地运行
.rb
脚本和rake任务

在阅读并了解了短暂的文件系统是如何工作的之后,我认为当我在
heroku run bash中使用
ls
时,任务实际上在工作,但是文件被破坏了(或者实际上在那里,但我看不到它?)

有人能解释一下我发生了什么事吗?如果我试图从S3获取一个文件写入Heroku上我的应用程序是徒劳的?如果有其他选择呢?


如果在这之后我还不能弄清楚,那么我将在EC2中设置我自己的env。

使用Heroku,你没有运行一个应用程序,而是有几个应用程序,每个应用程序都有一份代码副本,运行应用程序的某些方面,并且每个应用程序都独立于其他应用程序。尤其是每个dyno的文件系统都是独立的

在你的例子中,你推送你的应用程序,这会创建一个(或者更多)web dynos,运行你的Rails应用程序——处理web请求

您还可以使用下载文件的计划任务。当它运行时,将创建一个新文件,并将该文件下载到该dyno的文件系统中。当任务完成时,dyno以及下载的文件将被丢弃

当您运行heroku runbash时,您又创建了一个一次性的dyno,显然该文件不在dyno的文件系统中


解决方案将完全取决于您尝试执行的操作,但有一个建议是将文件中的数据放入您的数据库中,以便其他Dyno可以轻松访问。

这是绝对可能的。你可以看一看著名的Hartl教程,看看它在micropost示例中的实际应用。如果我还记得的话,在我阅读教程时,我自己也曾对此进行过一些思考,我的问题是关于政策(确保你有一个适当的政策,并且它足够广泛以允许你想要的行动)。Heroku不支持你想做的事情。您可以将tmp文件写入本地文件系统,但这些文件将被自动删除。@steve您可以发布一个简单的工作示例吗?@spickerman从S3中提取此文件非常重要,每次用户使用应用程序时都会使用这些内容……因此,您是否建议从S3中提取该文件,将其作为临时文件写入,将结果提供给用户,然后每次都将其销毁,这不是好的做法。该文件是一个相当小的
.csv
表。为什么您不能直接从Amazon S3提供该文件,就像您可以从内容交付网络提供引导或javascript一样。您会发现这种方法更具可扩展性。谢谢。我以前听过,但出于某种原因,它只是点击。所以基本上,Heroku是这个应用程序的错误平台。@Dixon11111:我认为你的设计是错误的。web服务器应该是无状态的。如果依赖下载到本地文件系统的文件,则应用程序无法水平扩展。Heroku只是把这一点说得很清楚。我怀疑情况就是这样。