Google Cloud Functions 部署:EROFS:只读文件系统

Posted

技术标签:

【中文标题】Google Cloud Functions 部署:EROFS:只读文件系统【英文标题】:Google Clould Functions deploy: EROFS: read-only file system 【发布时间】:2018-12-20 20:28:22 【问题描述】:

我正在尝试将我的 api 部署到 Google Cloud Functions,我得到了这个:

EROFS:只读文件系统,mkdir '/user_code/uploads'

⚠  functions[post]: Deployment error. Function load error: 
    Code in file index.js can't be loaded. Is there a syntax error in your code? 
    Detailed stack trace: Error: EROFS: read-only file system, mkdir '/user_code/uploads'
    at Error (native)
    at Object.fs.mkdirSync (fs.js:932:18)
    at Function.sync (/user_code/node_modules/multer/node_modules/mkdirp/index.js:71:13)
    at new DiskStorage (/user_code/node_modules/multer/storage/disk.js:21:12)
    at module.exports (/user_code/node_modules/multer/storage/disk.js:65:10)
    at new Multer (/user_code/node_modules/multer/index.js:15:20)
    at multer (/user_code/node_modules/multer/index.js:95:12)
    at Object.<anonymous> (/user_code/api/user.js:105:46)
    at Module._compile (module.js:577:32)
    at Object.Module._extensions..js (module.js:586:10)

【问题讨论】:

它与 multer 初始化有关。但是文件系统是只读的事实仍然是一个问题。 【参考方案1】:

除了os.tmpdir()(很可能是/tmp,但您不应该假设)之外,Cloud Functions 运行时中的所有内容都是只读的。如果您有任何代码(例如在 api/user.js 中)尝试在其他任何地方写入,则会出错。

【讨论】:

事情就是这样。在我从文档中复制的 multer 初始化中,有一个 /uploads 文件夹。以前工作过,因为该文件夹包含在部署中。谢谢。 @Doug Stevenson,这是否意味着无法从 Cloud Functions 启用对 Cloud Storage 的写入访问权限?我正在从Text-To-Audio 生成 mp3s 文件,并计划通过 Cloud Functions 保存以卸载客户端逻辑。最坏的情况我可以在客户端处理。 @AdamHurwitz 写入云存储与写入云函数中的本地文件系统没有任何关系。您完全可以使用它的 SDK 写入 Cloud Functions,并且有很多示例代码可以做到这一点。 当用户上传文件需要稍后写入Storage时,是否推荐写入/tmp storage? @AkasAntony 做任何你觉得最方便的事情。但是,如果您可以直接写入存储而不写入 tmp,那么内存效率会更高。【参考方案2】:

python 也有同样的问题,上面的答案对我有用,但为了清楚起见。我的错误 -

File "/env/local/lib/python3.7/site-packages/google/cloud/storage/blob.py", line 753, in download_to_filename
    with open(filename, "wb") as file_obj:
OSError: [Errno 30] Read-only file system: 'testFile.zip'

Google 的文档可以是found here。

虽然 Cloud Storage 是在 App Engine 中读写文件的推荐解决方案,但如果您的应用只需要写入临时文件,您可以使用标准 Python 3.7 方法将文件写入名为 /tmp 的目录。

此目录中的所有文件都存储在实例的 RAM 中,因此写入 /tmp 会占用系统内存。此外,/tmp 目录中的文件仅对创建文件的应用程序实例可用。当实例被删除时,临时文件也被删除。

【讨论】:

你先生是一个绝对的传奇。

以上是关于Google Cloud Functions 部署:EROFS:只读文件系统的主要内容,如果未能解决你的问题,请参考以下文章

使用TensorFlow作为依赖项部署Google Cloud Functions

在本地测试 Python Google Cloud Functions

Google Cloud Platform:Cloud Functions 与 App Engine

Google Cloud Functions Deploy“允许未经身份验证的调用......”

为啥我的函数没有部署到 Google Cloud Platform?

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?