从 dockerfile 和 pythonfile 中的 uvicorn 命令运行 fastapi 有区别吗?

cer*_*ais 11 python docker fastapi uvicorn

我正在运行一个快速的 api,当我在开发时,我的 app.py 文件中有以下一段代码

app.py 中的代码:

import uvicorn


if __name__=="__main__":
    uvicorn.run("app.app:app",host='0.0.0.0', port=4557, reload=True, debug=True, workers=3)
Run Code Online (Sandbox Code Playgroud)

所以我正要CMD ["python3","app.py"]在我的 Dockerfile 中运行。

在 fastapi 示例中,他们做了这样的事情:

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Run Code Online (Sandbox Code Playgroud)

我想知道这两种方法有什么区别,因为我认为它们都可以工作。

JPG*_*JPG 9

不,没有区别。

命令行运行方法 ( uvicorn app.main:app) 和使用 python 命令 ( python app.py)执行 app.py是相同的。这两种方法都在后台调用uvicorn.main.run(...)函数。

换言之,该uvicorn指令是一个快捷方式uvicorn.run(...)功能。

所以,在你的情况下,函数调用

uvicorn.run("app.app:app",host='0.0.0.0', port=4557, reload=True, debug=True, workers=3)
Run Code Online (Sandbox Code Playgroud)

可以通过 uvicorn 命令行来完成,

uvicorn app.app:app --host 0.0.0.0 --port 4557 --reload --debug --workers 3
Run Code Online (Sandbox Code Playgroud)

旁注

--debug选项是从隐藏的命令行选项帮助页,但它可以在发现源代码。因此,感觉使用uvicorn命令运行应用程序可以被视为生产事物。

  • `--debug` 选项不再存在,答案可以更新。~ 这里是 uvicorn 的维护者。 (3认同)

Yag*_*nci 5

答案是。应用程序没有什么区别,使用Docker进行部署只是让它变得更容易,没有 Docker,您需要使用ASGI兼容服务器(如 Uvicorn)来运行它,您还可能需要设置一些工具来确保它在停止或停止时自动重新启动崩溃。Docker 镜像可以自动处理所有这些作业,而不是尝试手动处理。