FastAPI (uvicorn) + Docker 忽略指定主机

问题描述 投票:0回答:1

我需要在远程计算机上的 Docker 中运行 FastAPI,并使其可供来自任何计算机的curl 请求访问。容器构建并且 uvicorn 启动,但是当我尝试执行 curl 请求时,出现连接错误。我已经在参数中指定了主机 0.0.0.0,但是尝试不同的端口时我注意到端口参数似乎在 uvicorn 启动时被忽略。主机参数可能也会发生这种情况。当我在本地以相同的方式运行时,我不会遇到这个问题,至少我在本地日志中得到

Uvicorn running on http://0.0.0.0:some_port (Press CTRL+C to quit)

Dockerfile

ARG PYTHON_VERSION=3.11-slim-buster
FROM python:${PYTHON_VERSION} as python

WORKDIR /app
ADD . .
RUN pip install -r requirements.txt
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8501"]

docker-compose.yml

version: '3.5'

services:
  container-name:
    container_name: container-name
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - ./env/demo.env      
    ports:
      - "8501:8501" 

docker compose down && docker-compose build --no-cache && docker compose up

...
container-name  | INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
...

可能存在什么问题以及我可以尝试解决什么问题?

python docker docker-compose fastapi uvicorn
1个回答
0
投票

您的设置看起来应该可以工作。但是,让我们从一个可行的简单项目开始,然后我们可以推广到您的具体案例。

假设该项目看起来像这样:

├── docker-compose.yml
├── Dockerfile
├── main.py
└── requirements.txt

我对你的

Dockerfile
做了一些小调整:

  • 单独复制
    requirements.txt
    ,以便在其余代码更改时不安装依赖项;和
  • 直接运行
    uvicorn
    ,而不是通过
    python
    (实际上只是一个偏好问题)。
ARG PYTHON_VERSION=3.11-slim-buster
FROM python:${PYTHON_VERSION} as python

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app","--host", "0.0.0.0","--port", "8501"]

最小

requirements.txt
main.py

uvicorn==0.27.0
fastapi==0.109.2
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World!"}

然后像您一样运行(但插入一些命令中似乎缺少的

-
):

docker-compose down && docker-compose build && docker-compose up

© www.soinside.com 2019 - 2024. All rights reserved.