繁体   English   中英

运行 FastAPI 的 docker img 时出现 ModuleNotFoundError

[英]ModuleNotFoundError when running docker img of FastAPI

谁能看到我在这里做错了什么? 在本地工作正常,但是在 docker 中运行它时,它似乎找不到我的模块......

如果该信息有帮助, init .py 文件是空的。 我不是 docker 方面的专家,到目前为止,我在谷歌搜索/stackoverflow 上搜索的提示都没有成功,例如在 dockerfile 中添加 pythonpath env。

来自 docker 的错误日志:

Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 331, in main
run(**kwargs)
File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 354, in run
server.run()
File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 382, in run
loop.run_until_complete(self.serve(sockets=sockets))
File "uvloop/loop.pyx", line 1456, in uvloop.loop.Loop.run_until_complete
File "/usr/local/lib/python3.7/site-packages/uvicorn/main.py", line 389, in serve
config.load()
File "/usr/local/lib/python3.7/site-packages/uvicorn/config.py", line 288, in load
self.loaded_app = import_from_string(self.app)
File "/usr/local/lib/python3.7/site-packages/uvicorn/importer.py", line 23, in import_from_string
raise exc from None
File "/usr/local/lib/python3.7/site-packages/uvicorn/importer.py", line 20, in import_from_string
module = importlib.import_module(module_str)
File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "./main.py", line 3, in <module>
from routers.user import router as user_router
ModuleNotFoundError: No module named 'routers'

Dockerfile:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

RUN apt-get update
RUN apt-get install -y --no-install-recommends

# install requirements
RUN pip3 install fastapi[all] uvicorn[standard]

# Move files
COPY ./* /app

# attemt to fix a python ModuleNotFoundError
WORKDIR /app
#ENV PATH=$PATH:/app
ENV PYTHONPATH "${PYTHONPATH}:/app"

CMD [ "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "15400"]

Docker-compose.yml:

version: '3'
services: 
    core_api:
        build: .
        container_name: "core-api-container"
        ports:
            - "8000:15400"
        volumes: 
            - ./app/:/app

文件结构:

API/
--__init__.py
--Dockerfile
--docker-compose.yml
--main.py
--routers/
  --__init__.py
  --user.py
  --x.py

主要.py:

from fastapi import FastAPI

from routers.user import router as user_router
from routers.x import router as x_router

app = FastAPI()

app.include_router(user_router)
app.include_router(x_router)

运行docker container run -it your-docker-container bash并检查文件后,似乎 docker 没有像我预期的那样复制文件层次结构。 所有文件都在同一个文件夹/app下。 我的本地文件中的项目中的任何子文件夹都没有被添加,只是那些包含的文件。 难怪我得到了 ModuleNotFoundError。

为了解决这个问题,我简单地创建了一个新项目并将我所有的 python 文件放在同一个目录中,并编辑它们以正确导入。 可能有更简单的方法来解决这个问题,但是 cba. 在这个时候弄清楚。

我对此几乎有同样的问题,我尝试通过更改应用程序的目录结构或复制文件的方式而不是通过直接使用 gunicorn 运行应用程序来解决它。

我使用以下命令运行它:

gunicorn -k uvicorn.workers.UvicornWorker run:app

如果您使用的是 docker-compose,则可以在 docker 文件的入口点或 compose 的命令部分中更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM