FastAPI 应用 运行 在本地但不在 Docker 容器中
FastAPI app running locally but not in Docker container
我有一个 FastAPI 应用程序,它在 运行 本地时按预期工作,但是,当我尝试 运行 在 Docker 中时,我得到一个 'Internal Server Error'容器。这是我的应用程序的代码:
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
,但当我使用这个 Docker 文件构建时却不行:
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
。我的 docker 文件或 docker 命令有问题吗?或者我该如何调试它?
运行 docker 不带 -d
参数,您将获得更多线索。如果我猜的话,我可能会说您缺少一些 python 要求。
这里有很多可能的问题。
当运行在一个容器中,你需要通过选项--host 0.0.0.0
告诉Uvicorn不要关心传入的主机IP
您没有指定图像运行时执行的命令。最好在 dockerfile 中明确说明这一点,例如CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
确保在 运行 图像时正确映射端口。根据您提供的内容,您期望容器中的服务在端口 80 上侦听,这没问题,但 uvicorn 的默认值为 8000(请参阅第 2 点以明确设置端口)。
我遇到了同样的问题,因为 --port 8000
在
中丢失了
command: uvicorn main:app --host 0.0.0.0 --port 8000
我有一个 FastAPI 应用程序,它在 运行 本地时按预期工作,但是,当我尝试 运行 在 Docker 中时,我得到一个 'Internal Server Error'容器。这是我的应用程序的代码:
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
,但当我使用这个 Docker 文件构建时却不行:
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
。我的 docker 文件或 docker 命令有问题吗?或者我该如何调试它?
运行 docker 不带 -d
参数,您将获得更多线索。如果我猜的话,我可能会说您缺少一些 python 要求。
这里有很多可能的问题。
当运行在一个容器中,你需要通过选项
告诉Uvicorn不要关心传入的主机IP--host 0.0.0.0
您没有指定图像运行时执行的命令。最好在 dockerfile 中明确说明这一点,例如
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
确保在 运行 图像时正确映射端口。根据您提供的内容,您期望容器中的服务在端口 80 上侦听,这没问题,但 uvicorn 的默认值为 8000(请参阅第 2 点以明确设置端口)。
我遇到了同样的问题,因为 --port 8000
在
command: uvicorn main:app --host 0.0.0.0 --port 8000