【问题标题】:Deploying Haskell yesod docker container on google app engine在谷歌应用引擎上部署 Haskell yesod docker 容器
【发布时间】:2020-09-19 11:17:25
【问题描述】:

我正在尝试在 Google App Engine 上上传一个 yesod Docker 容器。源码为here,Docker镜像为here

我遵循Custom runtime quickstart 中的文档,当调用gcloud app deploy 时,应用程序在增加构建超时后构建良好,但容器在尝试启动时进行就绪检查或显示以下超时消息:

ERROR: (gcloud.app.deploy) Operation [apps/meeshkan-github-webhook-router/operations/xxxx-xxxx-xxxx] timed out. This operation may still be underway.

我尝试了几件事,包括手动准备检查、创建/_ah/health 端点以及将准备检查的超时时间一直增加到 1799 秒,但这些操作似乎都不起作用。

一个问题可能是容器的大小(它是 3.2gb),我可以尝试将其缩减,但只有在有人能够确认容器大小是导致部署问题的一个因素时,我才会这样做。除此之外,我不确定是什么导致了这个失败。 docker 镜像在我们的本地机器上启动良好。

提前感谢您的帮助和建议!

【问题讨论】:

  • 我克隆了您共享的 GIT 存储库,将构建超时更改为 30 分钟,并在部署期间出现以下错误消息:ERROR: (gcloud.app.deploy) Error Response: [4] Your deployment has failed to become healthy in the allotted time and therefore was rolled back. If you believe this was an error, try adjusting the 'app_start_timeout_sec' setting in the 'readiness_check' section.
  • 我完全不精通 Haskell,无法在这方面为您提供进一步的指导,但是您在应用程序中实现 split health checks 的方式存在问题,因为通过检查日志我在日志中注意到有很多 503 错误消息用于准备检查。
  • 谢谢@DanielOcando!我尝试更改 app_start_timeout_sec 并没有对结果产生影响。我阅读了您提供的文档,但我不确定阅读它是如何实现拆分健康检查的。我从文档中了解到不需要实施任何东西并且检查是自动的。您能告诉我如何使用 CLI 获取这些日志吗?我可以深入研究 503,看看是否可以修复它们。感谢您的帮助!
  • 请注意,您的应用程序实际上需要引入以下两个处理程序:/liveness_check/readiness_check,它们需要返回一个 200 响应。在app.yaml 级别上,您需要包含相关的elements。我认为您可以参考Yesod Book,了解如何在您的应用程序上实现处理程序的细节(正如我解释的那样,我的 Haskell 知识有限)。
  • 最后,请注意使用 /_ah/health 路径的运行状况检查现已弃用,您需要按照documentation 的这一部分了解如何实施拆分运行状况检查的迁移。

标签: google-app-engine google-cloud-platform yesod


【解决方案1】:

问题原来是,因为我是在 Windows 上构建的,所以在 Windows 上使用 Docker Desktop 构建的图像会自动赋予所有 shell 脚本可执行权限,而 Linux 上的 Docker 需要 shell 脚本才能获得可执行权限。通过将此行添加到我的 Dockerfile:

RUN chmod +x /usr/src/app/run.sh

一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多