Puedo ejecutar python FastAPI localmente (conectándome al host local http://127.0.0.1:8000/ ), pero cuando intento ejecutar a través del contenedor, no obtengo ninguna respuesta en el navegador. Tampoco hay mensaje de error.
contenido de main.py
from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q}contenido de Dockerfile
FROM python:3.9.5 WORKDIR /code COPY ./docker_req.txt /code/docker_req.txt RUN pip install --no-cache-dir --upgrade -r /code/docker_req.txt COPY ./app /code/app CMD ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0"]salida en cmd cuando se ejecuta el contenedor: -
docker run --name my-app1 python-fastapi:1.5 INFO: Will watch for changes in these directories: ['/code'] INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO: Started reloader process [1] using statreload INFO: Started server process [7] INFO: Waiting for application startup. INFO: Application startup complete.docker_req.txt --
fastapi==0.73.0 pydantic==1.9.0 uvicorn==0.17.4Inserte -d antes de ejecutar Docker para ejecutar su contenedor en modo Separado. intenta ejecutar:
docker run -d --name my-app5 -p 8000:8000 python-fastapi:1.5
Más simple: puede redirigir el puerto local 8000 al puerto acoplable 8000
docker run -p 8000:8000 ...y ahora puedes acceder a él usando uno de
http://0.0.0.0:8000http://localhost:8000http://127.0.0.1:8000 Más tiempo: puede exponer el puerto 8000 y ejecutarlo usando IP ventana acoplable
docker run --expose 8000 ... o en Dockerfile puede usar EXPOSE 8000
A continuación, debe encontrar Container ID
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e7c6c543246 furas/fastapi "uvicorn app.main:ap…" 3 seconds ago Up 2 seconds 8000/tcp stupefied_nasho
docker ps -q 0e7c6c543246 Y use (parte de) CONTAINER ID para obtener la dirección IP del contenedor
docker inspect 0e7c | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",o
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 0e7c 172.17.0.2Y ahora puedes acceder a él usando
http://172.17.0.2:8000EDITAR:
En una línea (en Bash)
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q) 172.17.0.2Resolví este problema creando un archivo yaml y ejecutándolo a través de docker-compose
version: '3' services: my-app: image: python-fastapi:1.5 ports: - 8000:8000En el archivo yaml, también probé sin puertos y todavía funcionó, mientras que el siguiente comando de ejecución de la ventana acoplable no funciona
docker run --name my-app5 -p 8000:8000 python-fastapi:1.5¿Alguien puede explicar por qué no funciona desde el comando "docker run" sino desde el archivo yaml?