我需要在远程计算机上的 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)
...
可能存在什么问题以及我可以尝试解决什么问题?
您的设置看起来应该可以工作。但是,让我们从一个可行的简单项目开始,然后我们可以推广到您的具体案例。
假设该项目看起来像这样:
├── 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