Tengo una aplicación FastAPI que funciona como se esperaba cuando se ejecuta localmente; sin embargo, aparece un "Error interno del servidor" cuando intento ejecutarla en un contenedor Docker. Aquí está el código para mi aplicación:
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']]] Que funciona localmente con uvicorn main:app , pero no cuando construyo usando este Dockerfile:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7 COPY ./app /app RUN pip install -r requirements.txty empezar con
docker run -d --name mycontainer -p 8000:80 myimage Veo un Internal Server Error en Postman. ¿Hay algún problema con mi dockerfile o los comandos de docker? O bien, ¿cómo depuro esto?
Hay una serie de posibles problemas aquí.
Cuando se ejecuta en un contenedor, debe decirle a Uvicorn que no se preocupe por la IP del host entrante con la opción --host 0.0.0.0
No ha especificado el comando ejecutado cuando se ejecuta la imagen. Lo mejor es dejar esto claro en el archivo acoplable, por ejemplo CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Cuando ejecute la imagen, asegúrese de asignar los puertos correctamente. Por lo que ha dado, espera que el servicio en el contenedor escuche en el puerto 80, eso está bien, pero el valor predeterminado para uvicorn es 8000 (consulte el punto 2 para configurar explícitamente el puerto).
Ejecute la ventana acoplable sin el parámetro -d y obtendrá más pistas al respecto. Si tuviera que adivinar, podría decir que te falta algún requisito de Python.
Tuve el mismo problema porque --port 8000 en
command: uvicorn main:app --host 0.0.0.0 --port 8000