docker 在两个不同端口上暴露FastAPI

sy5wg1nm  于 2023-05-16  发布在  Docker
关注(0)|答案(1)|浏览(205)

我想从我的FastAPI服务器上抓取一些指标。但是,我不想将其与其余API相比向公众展示。
因此,我决定创建第二个服务器并尝试运行(受此here的启发):

app = FastAPI()
app2 = FastAPI()

app2.mount("/metrics", metrics_app)

然后像这样用docker-compose设置它

version: '3.8'

services:

  scraiber_gpt:
    build:
      context: ./src
      dockerfile: Dockerfile.test
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000 & uvicorn app.main:app2 --reload --workers 1 --host 0.0.0.0 --port 8001
    volumes:
      - ./src:/usr/src/app
    ports:
      - 8004:8000
      - 8005:8001

但是,我看不到app 2中的任何内容。
有什么办法可以让它工作吗?🙂

4ioopgfo

4ioopgfo1#

问题出在uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000 & uvicorn app.main:app2 --reload --workers 1 --host 0.0.0.0 --port 8001命令上,它运行第一个uvicorn命令并等待它完成,但它没有完成,因为它是一个服务器应用程序。
如果你想在不同的端口上公开两个应用程序,并且你已经在运行docker compose,最简单的方法是启动两个容器:

version: '3.8'

services:
  scraiber_gpt:
    build:
      context: ./src
      dockerfile: Dockerfile.test
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0
    volumes:
      - ./src:/usr/src/app
    ports:
      - 8004:8000

  metrics:
    build:
      context: ./src
      dockerfile: Dockerfile.test
    command: uvicorn app.main:app2 --reload --workers 1 --host 0.0.0.0
    volumes:
      - ./src:/usr/src/app
    ports:
      - 8005:8000

如果你在nginx或类似的反向代理之后运行,另一个解决方案是在一个FastAPI应用程序中运行所有内容,然后只公开你想要对外部请求公开的路由。

相关问题