python - 无法在“app”gunicorn 中找到应用程序对象“app”
问题描述
我正在使用带有 gunicorn 的烧瓶微服务向托管在 Google Kubernetes 引擎上的服务发出请求。微服务是 dockerised 并且作为 pod 托管在 google kubernetes 引擎上。在本地测试后,我部署了它,但出现 CrashLoopBackOff 错误。我的 pod 的日志是:
[2019-03-15 08:41:13 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2019-03-15 08:41:13 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[2019-03-15 08:41:13 +0000] [1] [INFO] Using worker: threads
[2019-03-15 08:41:13 +0000] [12] [INFO] Booting worker with pid: 12
Failed to find application object 'app' in 'app'
[2019-03-15 08:41:13 +0000] [12] [INFO] Worker exiting (pid: 12)
[2019-03-15 08:41:13 +0000] [13] [INFO] Booting worker with pid: 13
Failed to find application object 'app' in 'app'
[2019-03-15 08:41:13 +0000] [13] [INFO] Worker exiting (pid: 13)
[2019-03-15 08:41:13 +0000] [1] [INFO] Shutting down: Master
[2019-03-15 08:41:13 +0000] [1] [INFO] Reason: App failed to load.
这似乎是gunicorn的错误。
我的文件夹结构是:
.
├── app.py
├── app.yaml
├── config.py
├── data
│ └── object_detection.pbtxt
├── Dockerfile
├── filename.jpg
├── helper.py
├── object_2.py
├── object_detection
│ ├── core
│ │ ├── anchor_generator.py
│ └── vrd_evaluation_test.py
├── object_detection_grpc_client.py
├── requirements.txt
└── tensorflow_serving
├── apis
└── regression_pb2.py
app.py代码是:
import logging
from flask import Flask, request, jsonify
from config import auth_secret_token, PORT, DEBUG_MODE
from helper import check_parameters
from object_detection_grpc_client import main
app = Flask(__name__)
def check_authorization(request):
try:
if not 'Auth-token' in request.headers:
return jsonify({'error': 'unauthorized access'}), 401
token = request.headers['Auth-token']
if token != auth_secret_token:
return jsonify({'error': 'unauthorized access'}), 401
return "ok", 200
except Exception as e:
return jsonify({'error': 'unauthorized access'}), 401
@app.route("/", methods=['POST'])
def hello():
info, status_code = check_authorization(request)
if status_code != 200:
return info, status_code
else:
status, status_code = check_parameters(request.form)
if status_code != 200:
return status, status_code
else:
score = main()
response = {"status": "success", "score": score, "customer_id":(request.form["cust_id"])}
return jsonify(response), status_code
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT, debug=DEBUG_MODE)
config.py代码是:
from os import environ as env
import multiprocessing
PORT = int(env.get("PORT", 8080))
DEBUG_MODE = int(env.get("DEBUG_MODE", 1))
# Gunicorn config
bind = ":" + str(PORT)
workers = multiprocessing.cpu_count() * 2 + 1
threads = 2 * multiprocessing.cpu_count()
auth_secret_token = "token"
server='A.B.C.D:9000'
model_name="mymodel"
input_image='filename.jpg'
label_map="./data/object_detection.pbtxt"
Dockerfile是:
FROM python:3.5.2
RUN apt update
WORKDIR /app
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
ADD . /app
ENV PORT 8080
CMD ["gunicorn", "app:app", "--config=config.py"]
部署文件 app.yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mymodel-client
labels:
name: mymodel-client
spec:
replicas: 1
selector:
matchLabels:
name: mymodel-client
template:
metadata:
name: mymodel-client
labels:
name: mymodel-client
spec:
containers:
- name: mymodel-client
image: gcr.io/image-identification/mymodel-client:v1
ports:
- containerPort: 8080
resources:
requests:
memory: 256Mi
limits:
memory: 512Mi
env:
- name: DEBUG_MODE
value: "1"
这里有什么问题?
链接到我提到的教程https://medium.com/google-cloud/a-guide-to-deploy-flask-app-on-google-kubernetes-engine-bfbbee5c6fb
解决方案
我认为问题可能与此类似。https://stackoverflow.com/a/50157417/4229159
app
文件夹(您在 docker 中创建的文件夹)和app
文件具有相同的名称。你能再试一次重命名其中一个吗?
其余文件看起来还可以,似乎只是一个问题gunicorn
推荐阅读
- c# - 当 Bitmap 被缩放时,它是这样的
- excel - 通过 VBA 将目录中的所有 XML 文件转换为 XLS
- javascript - 将参数附加到数组并评估每个数组元素
- typescript - “属性或方法“foo”未在实例上定义,但在渲染期间被引用”Vuejs Typescript
- git - 合并 Git 存储库,保留历史记录和参考
- php - 如何在heroku上成功安装firebase?
- css - CSS中标题标签的每个单词的第一个字母大一点
- python - 使用 TPU 模式时如何从 Google Colaboratory 保存 Tensorflow 检查点文件?
- c# - C# FTP 上传卡在特定文件上
- amazon-sns - 使用带有 aws sns 的 lambda 为单个设备发送推送通知