How to use heroku's ephemeral filesystem
我在Heroku(Cedar Stack)上使用python/django,我有一个管理命令需要编写,它将从S3桶中提取一个文件并处理它。我不确定我是否了解如何使用临时文件系统。是否只有某些目录是可写的?我发现了另一篇文章,暗示只有某些文件夹是可写的(但是,它似乎不适用于Cedar堆栈)。我找到了这篇dev文章,但它没有详细介绍(注意:我确实理解这只是暂时的。我只需要解压缩文件并处理该文件)。我可以在应用程序根目录下的任何位置创建一个文件夹吗?我该怎么做?好像我可以用美元回家。我通过连接到VIA做了一些测试
和运行:
返回:
应用程序
和运行:
在应用程序的根目录中创建一个文件夹,并与其他文件和文件夹使用相同的用户和组。
所以…我这里有什么不见的吗?更好的方法?是否有此操作系统环境变量?我已经运行了"env",但我看不到更好的版本。
- 请注意,无论何时执行heroku run,这都会在Heroku上旋转一个新的一次性Dyno,将被充电。之后,您可以通过heroku ps检查Dynos的状态,以查看它们是否仍在运行。当使用heroku run bash时,dyno与您的终端相连,即当您关闭终端会话(例如,使用ctrl+c)时,它应该停止。此外,一次性的dyno无法访问运行时编写的其他dyno的文件,因此ls等无法查看其他dyno上的内容(应用程序文件除外)。
- @ MarcoW。我想强调一下你的评论是多么的无礼!这是如此的不明显,以至于heroku run旋转了一个新的达诺。我花了一段时间才明白为什么我不能通过HTTP访问通过heroku run "echo test > /app/web/test.html"创建的文件…事实证明,他们是在一次性达诺创造的,从来没有面对过网络……
要真正理解临时文件系统,您需要了解dyno是什么。您可以阅读更多关于Dynos如何工作的信息。不过,简而言之,一个进程在一个拥有自己文件系统的虚拟机中的heroku上运行。该虚拟机可以由于多种原因而停止,并带走文件系统。
当应用程序重新启动、重新配置(如heroku config ...、缩放等)时,底层文件系统将被破坏。例如,如果您有两个web dynos,将一些文件写入临时文件系统,并缩放到三个dynos,这些文件将被破坏,因为您的应用程序正在新的dynos上运行。
通常,临时文件系统的工作方式与任何文件系统相同。您有权写入的目录,如$HOME和/tmp,可以将文件写入其中。任何需要永久保存的文件都应该写入S3或类似的持久存储。S3是首选,因为Heroku运行在AWS上,S3提供了一些性能优势。任何可以随意重新创建的文件都可以存储在Dyno的临时存储中。
- "S3是首选,因为Heroku在AWS上运行,S3提供了一些性能优势"-很好知道!哦!
您可以在'/tmp'目录下创建一个文件,该文件将在请求完成后被销毁。我在雪松上做这个,我没有任何问题。
- 事实上,任何地方都可以写在雪松堆上-/tmp只是从竹林时代回来的。但是,当Dyno重新启动/缩放等时,您将释放上载的任何内容。
- 如果这对其他人有帮助,我必须在根目录中创建一个名为"tmp"的目录。当我第一次看到这个答案时,听起来好像TMP已经作为Heroku的一部分存在了——在我的例子中,我创建了这个目录。