由于准备情况检查失败,Google App Engine 部署失败

2023-11-29

自定义应用程序引擎环境无法启动,这似乎是由于运行状况检查失败。该应用程序有一些自定义依赖项(例如 PostGIS、GDAL),因此在应用程序引擎映像之上有几层。它构建成功并在 Docker 容器中本地运行。

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.

The Dockerfile看起来如下(注:没有CMD因为入口点定义在docker-compose.yml and app.yaml):

FROM gcr.io/google-appengine/python
ENV PYTHONUNBUFFERED 1
ENV DEBIAN_FRONTEND noninteractive

RUN apt -y update && apt -y upgrade\
    && apt-get install -y software-properties-common \
    && add-apt-repository -y ppa:ubuntugis/ppa \
    && apt -y update \
    && apt-get -y install gdal-bin libgdal-dev python3-gdal  \ 
    && apt-get autoremove -y \
    && apt-get autoclean -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ADD requirements.txt /app/requirements.txt
RUN python3 -m pip install -r /app/requirements.txt 
ADD . /app/
WORKDIR /app

不幸的是,这会创建一个高达 1.58GB 的​​图像,但原始的 gcr.io python 图像从 1.05GB 开始,所以我认为图像的大小不会或应该成为问题。

使用以下命令在本地运行docker-compose.ymlconfig 可以立即完美地启动容器:

version: "3"
services:
  web:
    build: .
    command: gunicorn gisapplication.wsgi --bind 0.0.0.0:8080

所以,我本来期望以下内容yaml.app就可以了:

runtime: custom
env: flex
entrypoint: gunicorn -b :$PORT gisapplication.wsgi

beta_settings:
    cloud_sql_instances: <sql-db-connection>

runtime_config:
    python_version: 3

没有运气。因此,根据上面的错误,它似乎与准备情况检查有关。尝试增加应用程序启动的超时(15 分钟!)似乎有一些健康检查问题截至 2019 年 9 月,回滚到旧版运行状况检查并不是解决方案。

readiness_check:
    path: "/readiness_check"
    check_interval_sec: 10
    timeout_sec: 10
    failure_threshold: 3
    success_threshold: 3
    app_start_timeout_sec: 900

liveness_check:
    path: "/liveness_check"
    check_interval_sec: 60
    timeout_sec: 4
    failure_threshold: 3
    success_threshold: 2
    initial_delay_sec: 30

分割健康检查肯定是开启的。输出来自gcloud beta app describe is:

authDomain: gmail.com
codeBucket: staging.proj-id-000000.appspot.com
databaseType: CLOUD_DATASTORE_COMPATIBILITY
defaultBucket: proj-id-000000.appspot.com
defaultHostname: proj-id-000000.ts.r.appspot.com
featureSettings:
  splitHealthChecks: true
  useContainerOptimizedOs: true
gcrDomain: asia.gcr.io
id: proj-id-000000
locationId: australia-southeast1
name: apps/proj-id-000000
servingStatus: SERVING

但这不起作用,因此还尝试增加实例可用的资源,并为 1 个 CPU 分配最大内存量(6.1GB):

resources:
    cpu: 1
    memory_gb: 6.1
    disk_size_gb: 10

为了安全起见,我向应用程序添加了运行状况检查端点(旧版运行状况检查和拆分运行状况检查) - 这是一个 Django 应用程序,因此这进入了项目的urls.py:

path(r'_ah/health/', lambda r: HttpResponse("OK", status=200)),
path(r'readiness_check/', lambda r: HttpResponse("OK", status=200)),
path(r'liveness_check/', lambda r: HttpResponse("OK", status=200)),

因此,当我深入查看日志时,似乎有一个成功的请求/liveness_check来自curl用户代理,但后续请求/readiness_check来自 GoogleHC 代理返回 503(服务不可用)

log viewer screenshot

不久之后(在 8 个失败的请求之后 - 为什么是 8 个?)似乎发送了一个关闭触发器:

2020-07-05 09:00:02.603 AEST Triggering app shutdown handlers.

对这里发生的事情有什么想法吗?我想我已经用尽了解决这个问题的选项,并且想知道是否可以更好地投入时间来在 Compute/EC2 中启动和运行。

ADDENDUM:

除了链接的 SO 问题之外,我还遇到了 Google 上的问题(here and here)


您正在将准备情况检查发送至path: "/readiness_check",但是你的 url 处理程序是path(r'readiness_check/'...)

请注意处理程序中的尾部斜杠。删除它(或在路径中添加一个尾部斜杠readiness_check:)并看看是否可以解决问题。我认为这会给你一个404,但你得到的是503这告诉我你可能有一个更严重的错误。单击左侧的箭头之一503在控制台中,查看错误消息是什么。您可能需要在控制台中搜索traceback看见了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于准备情况检查失败,Google App Engine 部署失败 的相关文章

随机推荐

  • jquery - 如何检查元素是否附加了任何类

    你可能会认为这很容易实现 但是哦 好吧 无论如何 我有一个元素 可以根据网站上的交互添加或删除类 我可以轻松地检查对象是否具有特定的类 使用 element hasClass myClass 但如何在不知道其名称的情况下检查该元素是否附加有
  • 伪元素上的 Font Awesome 5 显示方形而不是图标

    我正在尝试更改 a 的内容span直接从 CSS 页面使用 Font Awesome 图标 但似乎无法使其正常工作 1 我已经从文档和中导入了FA 2 我的html看起来像这样 span class myClass Movies span
  • 如何使用javascript获取文件夹中的文件列表

    我正在开发桌面应用程序项目 我在用Qt使用 Visual C 进行控制 我正在 QWebView 中加载一个 html 文件 m pWebView gt load QUrl demo index Splash Screen html 现在
  • 在 SQL Server 中使用 STRING_AGG 获取唯一值

    以下查询返回如下所示的结果 SELECT ProjectID newID value FROM dbo Data WITH NOLOCK CROSS APPLY STRING SPLIT bID AS newID WHERE newID v
  • 使用“in”属性检查对象中是否存在键的时间复杂度[重复]

    这个问题在这里已经有答案了 使用以下命令检查对象中是否存在某个键的时间复杂度是多少in财产 Example var obj key1 value1 key2 value2 key3 value3 if key1 in obj 这是来自V8
  • 如何在 Keras 中提取训练集和验证集?

    我实现了一个神经网络keras 具有以下结构 model Sequential layers model compile optimizer loss hist model fit x X y Y validation split 0 1
  • 从查询sql数据库获取数据到javascript

    我的代码有问题 像这样的情况 我有一个下拉列表 如果选择 个人 则会出现新的下拉列表 其中包含从数据库查询检索的数据 如果选择 公共 则下拉列表消失 HTML 代码如下
  • AES CBC 解密有效,CTR 无效

    我正在尝试使用 AES CBC 和 CTR 模式解密数据 密文前面已添加 16 字节 IV 我的密文数据采用以下格式 vector
  • live() 和 bind() 在 jQuery 1.7 后被弃用的原因是什么

    从 jQuery 1 7 开始 live and bind 已被弃用 取而代之的是 on 正在使用中 这两个都是很棒的功能 运行起来很有魅力 移除的目的是什么 这背后的技术原因是什么 And why on 是否提供使用 引用自此articl
  • 检查数组是否包含具有特定属性值的对象

    我有一个大约 30 个对象的数组 每个对象都有一个称为 注册 的属性 我用注册属性来唯一标识每个对象 每个对象还包含一个时间戳 始终是唯一的 每隔 30 秒 我就会从 API 下载这 30 个对象的一个 新实例 有可能将新对象添加到当前数组
  • 查找从数据框到特定位置最近的城市

    下面的数据框包含有关纬度 经度 州和城市的信息 我想找到 数据框中给出的每个城市的三个最近的城市 例如 从下面 dataframe 俄克拉荷马城和 Colarado SPringd 距离阿尔伯克基最近 所以距离阿尔伯克基最近的三个城市应该是
  • 将 JAR 添加到 Eclipse Java 库

    如何将 JAR 文件添加到 Eclipse 中已有的 Java 库 请注意 这不是用户库 也就是说 如果您查看 Java 项目的 Java 构建路径并单击 库 选项卡 您将看到该项目使用的库的列表 如果展开给定的库 您将看到该库中包含的 J
  • Linux C/C++程序如何支持多种语言?

    例如 在这个最简单的 hello world 程序中 include
  • 如何在 NAT 后面实现 CORBA 客户端

    我有以下接口 interface Server void subscribe in Client client interface Client void ping void pong 初始化时 客户端将连接到服务器并调用 subscrib
  • 您可以在两个 git 存储库之间共享文件及其历史记录吗?

    我不确定这是否可行 但我希望能够拥有一个文件并在 git 存储库中保存的两个项目中使用它 这样 如果我在一个项目中进行更改 则在拉取文件时另一个项目会接受该更改 理想情况下 该特定文件的历史记录将显示两个项目的所有更改 其他一切都将保持独立
  • 如何在 Windows 10 中启用 VT100 终端仿真?

    我想在Python程序执行期间 在IDLE或CMD或其他终端中 使用ANSI转义码打印彩色文本 请告诉我 Windows 命令提示符启用 VT100 终端仿真的确切命令 或者逐步告诉我另一种方法 我已经搜索并找到了一些方法 但我不明白如何实
  • 查找 MongoDB 中数组内字段的总和

    我有一个数据如下 gt db PQRCorp find pretty id 0 name Ancy results evaluation term1 score 1 463179736705023 evaluation term2 scor
  • 如何检测 Vaadin FileDownloader 何时成功或失败

    我有 Vaadin 7 代码 为用户提供下载文件的选项 Button btnDownloadResults new Button Download Results FontAwesome CLOUD DOWNLOAD resource ne
  • 高阶函数 - Javascript

    我正在使用 Eloquent Javascript 进行工作 功能count接受一个数组和一个测试函数 等于 x 作为参数 并返回测试函数返回 true 的数组中的元素数量 我了解这些功能工作的大致方式 并且从逻辑上讲total传递给red
  • 由于准备情况检查失败,Google App Engine 部署失败

    自定义应用程序引擎环境无法启动 这似乎是由于运行状况检查失败 该应用程序有一些自定义依赖项 例如 PostGIS GDAL 因此在应用程序引擎映像之上有几层 它构建成功并在 Docker 容器中本地运行 ERROR gcloud app d