我想构建一个Docker镜像,在Google Cloud Run上运行FastAPI。FastAPI使用Uvicorn作为ASGI服务器,Uvicorn建议与Uvicorn工作类一起使用Gunicorn进行生产部署。FastAPI本身还有一些关于如何使用Gunicorn和Uvicorn的优秀文档。我甚至发现FastAPI提供了一个官方镜像,将两者组合起来(uvicorn-gunicorn-fastapi-docker),但是这个镜像带有警告:
我的问题是,我应该在Dockerfile中安装Gunicorn和Uvicorn,并在进程级别处理复制吗?类似于:
我应该坚持使用单一进程的Uvicorn,让Cloud Run(Kubernetes)在集群级别上处理复制吗?例如:
这个警告基本上解释了复制将在“集群级别”处理,不需要在“进程级别”处理。这是有道理的。但我不太确定Cloud Run是否属于此类?实质上,它是一个抽象和托管的Knative服务,因此在Kubernetes上运行。你可能正在使用Kubernetes或类似的工具。如果是这种情况,你可能不需要这个镜像(或任何其他类似的基础镜像)。最好从头开始构建一个Docker镜像。
我的问题是,我应该在Dockerfile中安装Gunicorn和Uvicorn,并在进程级别处理复制吗?类似于:
CMD ["gunicorn", "app.main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:80"]
我应该坚持使用单一进程的Uvicorn,让Cloud Run(Kubernetes)在集群级别上处理复制吗?例如:
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]