59

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

$ heroku run bash

并运行:

$ echo #HOME

返回:

/应用程序

并运行:

$ mkdir $HOME/tmp

在应用程序的根目录中创建一个文件夹,并提供与其他文件和文件夹相同的用户和组。

所以......我在这里错过了什么?有更好的方法吗?是否有为此的操作系统环境变量?我已经运行了“env”,但没有看到更好的。

4

2 回答 2

78

要真正了解临时文件系统,您需要了解什么是测功机。您可以阅读有关dynos 工作原理的更多信息。不过,简而言之,一个进程在 Heroku 上运行在具有自己文件系统的虚拟机中。该虚拟机可能会因多种原因停止,同时带走文件系统。

当应用程序重新启动、重新配置(例如heroku config ...)、缩放等时,底层文件系统将被破坏。例如,如果您有两个 web dyno,将一些文件写入临时文件系统,然后扩展到三个 dyno,这些文件将被破坏因为您的应用程序正在新的测功机上运行。

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

于 2012-09-14T06:06:17.337 回答
57

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

于 2012-09-14T01:16:23.567 回答