【问题标题】:Google Run Flask executionGoogle Run Flask 执行
【发布时间】:2021-10-08 03:30:01
【问题描述】:

我的目标是使用他们的 Run 服务在谷歌云上运行我自己的 API。

我构建了一个简单的烧瓶应用程序,如 here 所示,并按照教程中的描述创建了容器映像。

我使用的确切代码如下:

import os

app = Flask(__name__)

@app.route("/")
def helloworld():
    print("1")
    return "worked"

print(__name__)
if __name__ == "__main__":
    print("0")
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
print("0.5")

现在,当我在本地运行此代码时,结果与我在谷歌云上运行时不同。

  1. __name__ 变量在云中运行时为 main。在本地执行,它是预期的__main__。因此 if 子句为 false 且未执行。
  2. 但令人惊讶的是,helloworld函数仍然执行,其余代码也再次运行。

所以 google cloud run 的日志中的输出如下所示:

main
0.5
1
main
0.5

当我在笔记本电脑上执行它时:

__main__
0
1

这里是 Dockerfile:

FROM python:3.8


ENV PYTHONUNBUFFERED True

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

RUN pip install flask gunicorn

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

有人可以向我解释这是为什么吗?这是我的错误还是错误?

我不熟悉使用云服务和 docker 映像。如果有人可以帮助我,我将不胜感激。 提前谢谢你。

如果问题不清楚,请告诉我。

编辑:添加 dockerfile

【问题讨论】:

  • 包括你的 Dockerfile。
  • 嗨@JohnHanley,我添加了 Dockerfile
  • 您在代码/容器中使用了两个 Web 服务器。烧瓶和独角兽。您的代码在云端运行,因为 _name_ 部分未使用 Flask Web 服务器。
  • 嗯,好的,谢谢。我将不得不更多地研究 Gunicorn 和 Flask 究竟做了什么。但是我想知道为什么当我删除 app.run() 部分正确时它仍然在谷歌云中工作?而 app.route("/") 就在这里,所以当有对指定 URL 的调用时,实际上执行了一个函数?

标签: python flask google-cloud-run docker-image


【解决方案1】:

原因很可能是因为您很可能在下面的 Dockerfile 中使用 gunicorn 构建了容器:

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

这是告诉 gunicorn 从 main.py 文件中导入 app 变量,因此 name 在该文件中将始终设置为 main。

来自文档:

此代码使用我们的“Hello World”问候语响应请求。 HTTP 处理由容器中的 Gunicorn Web 服务器完成。什么时候 直接调用以供本地使用,此代码创建一个基本的 Web 服务器 监听由 PORT 环境变量定义的端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2020-03-12
    • 2022-11-26
    • 2022-12-14
    • 2019-02-15
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多