docker - Google Cloud Run 在 Healthcheck 正常之前启动容器
问题描述
我的图像启动时间相对较长,约为 5 秒。换句话说,Flask 服务器已经启动并正在运行,但是我将一些数据加载到全局变量中,所以此时服务器并没有真正运行。如果我在此期间 ping 我的 Google Cloud Run 端点,连接将超时
upstream request timeout
为了避免这种情况,我添加了一个 docker healthcheck 来调用我服务器中的端点。此 http 请求的超时时间为 2 秒。如果超时,则意味着服务器仍在加载这些全局文件,并且端点还没有准备好接收请求。这在开发中运行良好,但在 Cloud Run 中却不行。Cloud Run 在完成加载之前开始向我的服务器提供流量 - 随后,在容器 HEALTHCHECK 状态实际上是“健康”之前。
我的问题
如何延迟 Cloud Run 将流量传输到我的容器,直到它完全设置好?
编辑 > 回答
就我而言(使用 Python + Gunicorn),我能够使用“应用程序工厂”模式来解决这个问题。也就是说,启动 Gunicorn
$ gunicorn 'test:create_app()'
函数create_app()
返回 Flask 应用程序的位置。
我关于为什么会这样的假设是因为在该函数返回之前,Gunicorn 还没有监听它绑定到的端口,并且 Cloud Run 不会开始将流量引导到新运行的容器,直到这种情况发生。
解决方案
rodrigo-silveira 的解决方案:
就我而言(使用 Python + Gunicorn),我能够使用“应用程序工厂”模式解决这个问题。也就是说,启动 Gunicorn
$ gunicorn 'test:create_app()' 函数 create_app() 返回 Flask 应用程序。
我对为什么会这样的假设是因为在该函数返回之前,Gunicorn 还没有监听它绑定到的端口,并且 Cloud Run 不会开始将流量引导到您正在运行的新容器,直到这种情况发生。
推荐阅读
- lotus-notes - 防止 NotesDocument 在打开时寻找冗余服务器
- laravel - 完全自定义 Laravel Nova 界面
- python - 无法弄清楚如何在 JSON 中进一步展平嵌套以输出到 CSV
- asp.net-web-api2 - WebAPI 2 方法对一个方法说 404,但不是另一种方法
- multithreading - 在这种读写器情况下是否需要检查条件变量虚假唤醒?
- jquery - 使用jquery滚动到div中的像素数
- typescript - RxJS typescript 理解泛型类型
- java - 结合 Eclipse RCP 3 和 4
- r - 跳过 r 中 for 循环中的特定列
- docker - docker-compose 连接多个项目