Ani*_*aha 14 python gunicorn docker fastapi uvicorn
我有一个 FastAPI 应用程序,正在使用 Uvicorn 以编程方式在端口 30000 上运行。现在我也想在端口 8443 上运行相同的应用程序。相同的应用程序需要在这两个端口上运行。我怎样才能在Python代码中做到这一点?
最小可重现代码:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/healthcheck/")
def healthcheck():
return 'Health - OK'
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=30000)
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", ports=[30000,8443])
Run Code Online (Sandbox Code Playgroud)
说明:我的应用程序将在我的组织 Azure Kubernetes 服务上运行。在端口 30000 上运行的应用程序保留用于内部 HTTP 流量,在 8443 上运行的应用程序映射到 Kubernetes 服务的 443 以暴露给外部流量。
更多详细信息:我将从此应用程序创建一个 Docker 容器,其想法是包括
CMD ["python3", "app.py"]
Run Code Online (Sandbox Code Playgroud)
最后运行应用程序。我正在寻找一种解决方案,它可以提供更改 python 代码 () 的方法uvicorn.run(app, host="0.0.0.0", ports=[30000,8443]),也可以更改 Dockerfile 中的 CMD 命令,例如此 GitHub 问题评论-gunicorn -k uvicorn.workers.UvicornWorker -w 1 --bind ip1:port1 --bind ip2:port2 --bind ip3:port3
小智 16
就我而言,我使用了上面相同的命令,但做了一些小改动。我需要在私人端口上公开其他路线。
app = FastAPI()
app2 = FastAPI()
Run Code Online (Sandbox Code Playgroud)
然后,在run.sh文件中,我有:
uvicorn app.main:app --reload --host 0.0.0.0 --port $PORT & uvicorn app.main:app2 --reload --host 0.0.0.0 --port $PORT_INTERNAL_APP
Run Code Online (Sandbox Code Playgroud)
小智 9
其中一种选择是使用 docker-compose 并在可变环境中传输端口。您只需要部署应用程序的多个实例。该版本尚未准备好用于生产,只是一个最小的示例。
docker-compose.yml
Dockerfile
main.py
requirements.txt
Run Code Online (Sandbox Code Playgroud)
主要.py:
from fastapi import FastAPI
import uvicorn
import os
app = FastAPI()
@app.get("/healthcheck/")
def healthcheck():
return 'Health - OK'
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=int(os.getenv('APP_PORT')))
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM python:3.8-slim
WORKDIR /usr/src/app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD [ "python", "./main.py" ]
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version: '2'
services:
internal-app:
image: internal-app
environment:
APP_PORT: "3000"
build:
context: .
dockerfile: ./Dockerfile
restart: unless-stopped
network_mode: host
external-app:
image: external-app
environment:
APP_PORT: "8443"
build:
context: .
dockerfile: ./Dockerfile
restart: unless-stopped
network_mode: host
Run Code Online (Sandbox Code Playgroud)
要求.txt:
uvicorn
fastapi
Run Code Online (Sandbox Code Playgroud)
开始 -docker-compose up -d --build
将启动 2 个应用程序,每个应用程序都在其自己的端口上。
以下解决方案对我有用。它在后台运行一个 Gunicorn 进程,然后运行另一个进程将其绑定到两个端口。其中一种将使用 HTTP,另一种可以使用 HTTPS。
Dockerfile:
FROM python:3.7
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
ENTRYPOINT ./docker-starter.sh
EXPOSE 30000 8443
Run Code Online (Sandbox Code Playgroud)
docker-starter.sh:
gunicorn -k uvicorn.workers.UvicornWorker -w 3 -b 0.0.0.0:30000 -t 360 --reload --access-logfile - app:app & gunicorn --access-logfile - -k --ca_certs ca_certs.txt uvicorn.workers.UvicornWorker -w 3 -b 0.0.0.0:8443 -t 360 --reload --access-logfile - app:app
Run Code Online (Sandbox Code Playgroud)
python 应用程序可以保持最小化:
FROM python:3.7
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
ENTRYPOINT ./docker-starter.sh
EXPOSE 30000 8443
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44265 次 |
| 最近记录: |