Actualmente tengo una aplicación fastapi que estoy desarrollando y trato de hacer pruebas en 2 máquinas. 1 con docker y otro sin.
en este caso sin docker one, quería lanzar uvicorn desde la terminal como de costumbre
uvicorn main:app --reloades posible ejecutar sin problema, con mi main.py teniendo importaciones de otro archivo como este
from util import search_card_pricecon lo mismo, busqué docker e intenté compilarlo, me dará este error
web_1 | File "./app/main.py", line 6, in <module> web_1 | from util import search_card_price web_1 | ModuleNotFoundError: No module named 'util'¿Cuál es la mejor manera de hacer mi importación que funcione en ambos lugares?
mi aplicación actual es algo así como para la estructura,
fastapi app main folder | ->app | -> main.py -> util.py -> config.py -> test.pysé si usar algo como esto funcionará para docker
from .util import search_card_pricepero con esta solución, no funciona en mi terminal local sin ventana acoplable. necesito saber como resolver ambos al mismo tiempo
aquí está mi dockerfile
# Dockerfile # pull the official docker image FROM python:3.9.4-slim # set work directory WORKDIR /app # set env variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # install dependencies COPY requirements.txt . RUN pip install -r requirements.txt # copy project COPY . .y la ventana acoplable componen
version: '3.8' services: web: build: . command: bash -c 'uvicorn app.main:app --host 0.0.0.0' volumes: - .:/app expose: - 8000 labels: - "traefik.enable=true" - "traefik.http.routers.fastapi.rule=Host(`testing.localhost`)" traefik: image: traefik:v2.2 ports: - 80:80 - 8081:8080 volumes: - "./traefik.dev.toml:/etc/traefik/traefik.toml" - "/var/run/docker.sock:/var/run/docker.sock:ro"Si el Dockerfile está fuera del directorio de la app , está copiando el directorio también /app dentro de la ventana acoplable. Eso mueve util.py a /app/app/util.py dentro de la ventana acoplable. Puedes usar
# copy project COPY .app /app/ para omitir la creación de otra app en /app .
Es posible que necesite eliminar app. del comando también.
command: bash -c 'uvicorn main:app --host 0.0.0.0'en realidad resulta que puedo usar la importación relativa
from .util import search_card_pricepara la ejecución local también, la importación relativa funciona en la ventana acoplable pero no en mi host local aquí sin la ventana acoplable porque estoy usando esto en mi terminal para iniciar fastapi
uvicorn main:app --reloadpero ahora, si retengo con importación relativa y uso este comando en su lugar
uvicorn app.main:app --reloadagregando aplicación. enfrente de la principal y ejecute este comando en mi carpeta de proyecto raíz, todo funciona bien para mi local con una importación relativa al parecer.