FastAPI应用程序在本地运行,但在Docker容器中无法运行

9

我有一个 FastAPI 应用程序,在本地运行时按预期工作,但是当我尝试在 Docker 容器中运行时,会出现“内部服务器错误”。以下是我的应用程序代码:

from fastapi import FastAPI
from pydantic import BaseModel
import pandas as pd
from fbprophet import Prophet

class Data(BaseModel):
    length: int
    ds: list
    y: list
    model: str
    changepoint: float = 0.5
    daily: bool = False
    weekly: bool = False
    annual: bool = False
    upper: float = None
    lower: float = 0.0
    national_holidays: str = None

app = FastAPI()

@app.post("/predict/")
async def create_item(data: Data):

    # Create df from base model
    df = pd.DataFrame(list(zip(data.ds, data.y)), columns =['ds', 'y'])

    # Add the cap and floor to df for logistic model
    if data.model == "logistic":
        df['y'] = 10 - df['y']
        df['cap'] = data.upper
        df['floor'] = data.lower

    # make basic prediction
    m = Prophet(growth=data.model,
                changepoint_prior_scale=data.changepoint,
                weekly_seasonality=data.weekly,
                daily_seasonality=data.daily,
                yearly_seasonality=data.annual
                )

    # Add national holidays
    if data.national_holidays is not None:
        m.add_country_holidays(country_name=data.national_holidays)

    # Fit data frame
    m.fit(df)

    # Create data frame for future
    future = m.make_future_dataframe(periods=data.length)

    # Add the cap and floor to future for logistic model
    if data.model == "logistic":
        future['cap'] = 6
        future['floor'] = 1.5

    # forecast
    forecast = m.predict(future)

    # Print values
    print(list(forecast[['ds']].values))

    # Return results
    # {'ds': forecast[['ds']], 'yhat': forecast[['yhat']], 'yhat_lower': forecast[['yhat_lower']], 'yhat_upper': forecast[['yhat_upper']] }
    return [forecast[['ds']], forecast[['yhat']], forecast[['yhat_lower']], forecast[['yhat_upper']]]

使用uvicorn main:app可以在本地运行,但使用以下Dockerfile构建时无法工作:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY ./app /app
RUN pip install -r requirements.txt

并以以下方式开始

docker run -d --name mycontainer -p 8000:80 myimage

我在 Postman 中看到 内部服务器错误 Internal Server Error。我的 dockerfile 或 docker 命令有问题吗?或者我该怎么进行调试?


检查 Docker 容器的日志! - Klaus D.
3个回答

15

这里可能出现了一些问题。

  1. 在容器中运行时,需要使用选项 --host 0.0.0.0 告诉 Uvicorn 不关注传入的主机IP。

  2. 你没有指定镜像运行时执行的命令。最好在 Dockerfile 中明确指定,例如:CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

  3. 确保在运行镜像时正确映射端口。根据你提供的信息,你希望容器中的服务监听80端口,这没问题,但是 Uvicorn 的默认端口是8000(参见点2中关于显式设置端口的内容)。


8

我之前遇到了同样的问题,因为缺少了--port 8000

command: uvicorn main:app --host 0.0.0.0 --port 8000

5

如果不带-d参数运行docker,你会得到更多关于它的线索。如果我要猜测的话,可能是你缺少一些Python要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接