如何使用 heroku 临时文件系统

Posted

技术标签:

【中文标题】如何使用 heroku 临时文件系统【英文标题】:How to use heroku's ephemeral filesystem 【发布时间】:2012-09-07 03:49:32 【问题描述】:

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

$ heroku run bash

并运行:

$ echo #HOME

返回:

/应用程序

并运行:

$ mkdir $HOME/tmp

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

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

【问题讨论】:

请注意,每当您执行heroku run 时,都会在Heroku 上启动一个新的one-off dyno,将收取费用。之后您可以通过heroku ps 检查您的测功机的状态,看看它们是否仍在运行。使用heroku run bash 时,测功机与您的终端绑定,即当您关闭终端会话时(例如使用 Ctrl+C)它应该停止。此外,一次性测功机无法访问您在运行时编写的其他测功机的文件,因此ls 等将无法查看您的其他测功机上的内容(您的应用程序文件除外)。 @MarcoW。我想强调您评论的重要性!这太不明显了,以至于heroku run 旋转了一个新的测功机。我花了一段时间才明白为什么我无法通过 HTTP 访问通过heroku run "echo test > /app/web/test.html" 创建的文件...事实证明它们是在一次性 dyno 上创建的并且从未面向网络... 【参考方案1】:

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

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

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

【讨论】:

" S3 是首选,因为 Heroku 在 AWS 上运行,S3 提供了一些性能优势" - 很高兴知道! ! :D @Naaman【参考方案2】:

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

【讨论】:

事实上,任何地方都可以在 cedar 堆栈上写入 - /tmp 只是从 Bamboo 时代回来的。当测功机重新启动/缩放等时,您将丢失上传的任何内容。 如果它对其他人有帮助 - 我必须在我的根目录中创建一个名为“tmp”的目录。当我第一次遇到这个答案时,听起来好像 tmp 已经作为 Heroku 的一部分存在——在我的例子中,我创建了目录。

以上是关于如何使用 heroku 临时文件系统的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一 aspx 页面中临时存储图像,而不使用文件系统?

使用 node.js 中的数据库插件将文件添加到 heroku 应用程序

如何使用 Asp.net 删除临时文件

如何使用文件内容设置 Heroku config var

使用 Heroku 时如何保存 Excel 文件?

如何调试使用 whitenoise、gunicorn 和 heroku 服务的 django 静态文件?