【发布时间】: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")
现在,当我在本地运行此代码时,结果与我在谷歌云上运行时不同。
-
__name__变量在云中运行时为main。在本地执行,它是预期的__main__。因此 if 子句为 false 且未执行。 - 但令人惊讶的是,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