如何使用heroku';s短暂的文件系统

如何使用heroku';s短暂的文件系统,heroku,filesystems,Heroku,Filesystems,我在Heroku(Cedar Stack)上使用Python/Django,我需要编写一个管理命令,该命令将从S3存储桶中提取一个文件并对其进行处理。我不确定我是否理解如何使用短暂的文件系统。是否只有某些目录是可写的?我发现另一篇文章暗示只有某些文件夹是可写的(但是,它似乎不适用于Cedar堆栈)。我找到了这个开发工具,但没有详细介绍(注意:我知道这只是暂时的,我只需要解压缩文件并处理文件)。我可以在应用程序根目录下的任意位置创建文件夹吗?我怎么才能得到呢?看来我可以用$HOME。我通过连接vi

我在Heroku(Cedar Stack)上使用Python/Django,我需要编写一个管理命令,该命令将从S3存储桶中提取一个文件并对其进行处理。我不确定我是否理解如何使用短暂的文件系统。是否只有某些目录是可写的?我发现另一篇文章暗示只有某些文件夹是可写的(但是,它似乎不适用于Cedar堆栈)。我找到了这个开发工具,但没有详细介绍(注意:我知道这只是暂时的,我只需要解压缩文件并处理文件)。我可以在应用程序根目录下的任意位置创建文件夹吗?我怎么才能得到呢?看来我可以用$HOME。我通过连接via做了一些测试

$ heroku run bash
和运行:

$ echo #HOME
$ mkdir $HOME/tmp
返回:

/应用程序

和运行:

$ echo #HOME
$ mkdir $HOME/tmp
在应用程序的根目录中创建一个文件夹,并提供与其他文件和文件夹相同的用户和组


所以。。。我有什么遗漏吗?有更好的方法吗?是否有用于此的OS环境变量?我已经运行了“env”,没有更好的了。

您可以在“/tmp”目录下创建一个文件,该文件将在请求完成后销毁。我在Cedar上做这件事,我没有遇到任何问题。

要真正理解短暂的文件系统,您需要了解dyno是什么。你可以阅读更多关于。不过,简而言之,一个进程在具有自己文件系统的虚拟机中的Heroku上运行。该虚拟机可能会因为多种原因而停止运行,同时也会导致文件系统停止运行

当应用程序重新启动、重新配置(例如heroku config…)、缩放等时,底层文件系统将被销毁。例如,如果您有两个web动态对象,将一些文件写入临时文件系统,并缩放到三个动态对象,则这些文件将被销毁,因为您的应用程序正在新的动态对象上运行


一般来说,临时文件系统与任何文件系统一样工作。您有写入权限的目录,如
$HOME
/tmp
,您可以将文件写入。任何需要永久保存的文件都应该写入S3或类似的持久存储。S3是首选,因为Heroku在AWS上运行,S3提供了一些性能优势。任何可以随意重新创建的文件都可以存储在dyno的临时存储中。

事实上,cedar stack上的任何地方都是可写的-/tmp只是从竹子时代回来的。当dyno重新启动/缩放时,你会丢失上传的任何东西。如果这对其他人有帮助,我必须在我的根目录中创建一个名为“tmp”的目录。当我第一次看到这个答案时,听起来好像tmp已经作为Heroku的一部分存在了——在我的例子中,我创建了目录。请注意,无论何时执行
Heroku run
,这都会在Heroku上产生一个新的收费项目。之后,您可以通过heroku ps查看dynos的状态,查看它们是否仍在运行。当使用heroku run bash时,dyno会绑定到终端,即当您关闭终端会话时,dyno会停止(例如,使用Ctrl+C)。此外,一次性dyno无法访问运行时编写的其他dyno的文件,因此
ls
等无法查看其他dyno上的内容(应用程序文件除外)。@MarcoW。我想强调你评论的重要性!这是如此不明显,以至于heroku run推出了一款新的dyno。我花了一段时间才明白为什么我不能通过HTTP访问通过heroku运行“echo test>/app/web/test.html”创建的文件。。。事实证明,它们是在一次性dyno上创建的,从来没有面对过web…”S3是首选,因为Heroku在AWS上运行,S3提供了一些性能优势”-很高兴知道!!:D@Naaman