我有一個 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)
我想要類似的東西
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", ports=[30000,8443])
說明:我的應用程式將在我的組織 Azure Kubernetes 服務上運行。在埠 30000 上運行的應用程式保留用于內部 HTTP 流量,而在 8443 上運行的應用程式映射到 Kubernetes Service 的 443 以暴露給外部流量。
更多詳細資訊:我將從這個應用程式中創建一個 Docker 容器,這個想法是包括
CMD ["python3", "app.py"]
最后運行應用程式。我正在尋找一種解決方案,它可以提供一種更改 python 代碼 ( uvicorn.run(app, host="0.0.0.0", ports=[30000,8443])) 或更改 Dockerfile 中的 CMD 命令的方法,例如This GitHub Issue Comment -gunicorn -k uvicorn.workers.UvicornWorker -w 1 --bind ip1:port1 --bind ip2:port2 --bind ip3:port3
uj5u.com熱心網友回復:
選項之一是使用 docker-compose 并在可變環境中傳輸埠。您只需要部署應用程式的多個實體。該版本不是生產就緒的,只是一個最小的例子。
docker-compose.yml
Dockerfile
main.py
requirements.txt
主要.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')))
Dockerfile:
FROM python:3.8-slim
WORKDIR /usr/src/app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD [ "python", "./main.py" ]
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
要求.txt:
uvicorn
fastapi
開始 - docker-compose up -d --build
將啟動 2 個應用程式,每個應用程式都在自己的埠上。
uj5u.com熱心網友回復:
我建議運行多個副本進行內部和外部通信
uvicorn.run(app, host="0.0.0.0", port=int(os.getenv('PORT')))
因此,您的部署之一將在 kubernets 中使用埠30000和8443運行。
因此,您可以創建兩種服務,一種用于外部通信,一種用于內部通信。
入口流量將獲得到在 8443 上運行的那些 Pod 的路由,而內部服務呼叫將獲得到在 30000 上運行的那些 Pod 的路由。
Ingress > service 1 > deployment 1 with port 8443 > pods
Internal traffic > service 2 > deployment 2 with port 30000 > pods
在這兩種部署中,您都可以通過設定環境來更改埠。
加點:
- 如果您的單個埠失敗或應用程式在內部呼叫或外部呼叫期間崩潰(因為將運行兩個部署),您的 POD 部署不會失敗
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326485.html
上一篇:無法將dockerizedspringboot應用程式連接到非dockerizedpostgres資料庫(本地主機)
下一篇:由于來自守護行程的錯誤回應,無法從終端登錄到Docker集線器:獲取“https://auth/v2/”:撥號tcp:查找身份驗證:沒有這樣的主機?
