Cloud Function 构建错误 - 无法从配置文件获取映像的操作系统

Posted

技术标签:

【中文标题】Cloud Function 构建错误 - 无法从配置文件获取映像的操作系统【英文标题】:Cloud Function build error - failed to get OS from config file for image 【发布时间】:2021-07-24 01:15:04 【问题描述】:

我在尝试部署 Cloud Function 时看到此 Cloud Build 错误:

“步骤 #2 - “分析器”:[31;1mERROR:[0m 无法初始化缓存:无法创建图像缓存:访问缓存图像“us.gcr.io/MY_PROJECT/gcf/us-central1/SOME_KEY/cache :latest": 无法从映像 'us.gcr.io/MY_PROJECT/gcf/us-central1/SOME_KEY/cache:latest' 的配置文件中获取操作系统"

我可以在本地构建和模拟云功能,但由于此错误,我无法部署它。到目前为止,我能够很好地部署。我到处找,我找不到任何关于这个的讨论。有人知道这里发生了什么吗?

更新:我在 3 天前部署了一个新功能,现在我似乎无法对其进行更新。我犯了同样的错误。我很确定这是由于我设置的生命周期规则来确保我不会继续存储函数图像:Firebase storage artifacts is huge and keeps increasing。这条规则很重要,因为我不想为不必要的存储付费,但它似乎可能是我们这里问题的根源。谷歌的人可以调查一下吗?

【问题讨论】:

您能分享您的语言、使用的命令行以及重现问题的最少代码吗? 我正在使用打字稿。我刚刚创建了一个新功能,并且部署良好。我更新了这个功能,更新也部署得很好。但是,当我尝试更新我已经拥有的任何功能时,它们都失败了。每一个。我不知道如何重现它,但似乎无法访问存储在 Firebase 中的现有功能的图像。我可以提取的任何日志都会有所帮助吗? 我正在使用这个命令从 CLI 部署:firebase deploy --only "functions:myFunction" 我注释掉了我现有功能之一的源代码,部署它,有效地删除它,然后取消注释源代码,重新部署它,有效地重新创建它。这解决了我的问题,我现在可以更新此功能。但是,此策略不适用于实际在生产中使用的任何功能。我真的需要删除并重新创建它。我很想首先了解导致此问题的原因。 @GregFenton 请为这个问题追踪者投票:issuetracker.google.com/issues/186832976 【参考方案1】:

即使对于之前成功部署的代码,我也遇到了同样的错误。

解决方法是删除 Container Registry 内失败的 Firebase 函数的 Docker 映像,然后重新部署这些函数。 (映像将在部署时重新创建。)

该错误仍然偶尔发生,因此我怀疑这可能是 Firebase 部署过程中引入的错误。值得庆幸的是,每次出现错误时,上述解决方法都能解决问题。

【讨论】:

删除这些会不会有停机时间? 不,即使删除 Docker 镜像,我现有的功能仍然可用。 @SameerMadan 这个解决方案对你有用吗? 这个解决方案对我有用。只是不要忘记删除缓存和工作图像。 这是正确答案。需要发生的是需要删除“工人”图像。感谢大佬分享!【参考方案2】:

我也遇到了同样的问题,通过删除Firebase项目的Container Registry中的镜像解决了。

当时我做了一个Script,我把它放在这里。用法如下。如果你喜欢,请使用它。

    安装Google Cloud SDK。 下载Script 将CONTAINER_REGISTRY 编辑为您的注册表名称。例如:CONTAINER_REGISTRY=asia.gcr.io/project-name/gcf/asia-northeast1 授予执行权限。 - $ chmod +x script.sh 执行它。 - $ sh script.sh 部署您的功能。

【讨论】:

【参考方案3】:

我在过去几天遇到了同样的问题,并与支持人员联系。我有相同的日志,在我的情况下,它没有连接到工件,因为工件在部署时会自动重建(阅读下面关于与工件相关的一个微妙案例以及如何修复它),但是删除函数并重新部署解决了给我。

工件自动清理

请注意,如果工件存储桶为空,则问题出在其他地方。

但如果它不为空,您可以做些什么来解决与工件自动清理相关的任何可能问题,即手动删除工件中应该解决的整个“容器”文件夹。然后再次重新部署。 确保不要删除工件存储桶本身!

来自 firebase confirmed 的面团,您提到的问题是删除工件内容是安全的。

所以,这里是如何删除它:

    进入谷歌云控制台,选择你的项目->存储->浏览器https://console.cloud.google.com/storage/browser

    选择“工件”存储桶

    选择“容器”并删除它

如果问题出在这里,那么之后应该可以正常工作。

发生这种情况是因为您在问题中引用的删除规则会检查每个文件的“最后更新”时间戳,而在重新部署时仅更新一些文件。所以第二天该规则将删除一些文件而留下其他文件,这将导致在这种情况下存储桶的状态不一致。因此,您只需手动删除所有内容。

【讨论】:

不幸的是,这并没有解决我的问题。今天早上我尝试部署更新时,工件存储桶中没有任何内容。 @SameerMadan 这意味着工件没有问题(除非 firebase 最近更改了某些内容)。您是否还尝试强制删除所有功能并重新部署它们? "您是否也尝试强制删除所有功能并重新部署它们?" --> 是的,我做到了。成功了,但几天后,我再次无法为这些新功能部署更新。

以上是关于Cloud Function 构建错误 - 无法从配置文件获取映像的操作系统的主要内容,如果未能解决你的问题,请参考以下文章

无法在安全的Google Cloud Function上获得CORS错误

从 Cloud Tasks 触发 HTTP Cloud Function 时出现 PERMISSION_DENIED 403 错误

无法从 GCP 调度程序调用 Google Cloud Function

Cloud Function Build Failed

从 Cloud Function 到 App Engine 的请求返回错误 401

Firebase Cloud Function Data 无法编码 BigInt