【问题标题】:ModuleNotFoundError when running docker img of FastAPI运行 FastAPI 的 docker img 时出现 ModuleNotFoundError
【发布时间】:2021-05-26 20:30:44
【问题描述】:

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

如果该信息有帮助,init.py 文件是空的。我不是 docker 方面的专家,而且到目前为止我在 googled/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

main.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)

【问题讨论】:

    标签: python docker docker-compose dockerfile fastapi


    【解决方案1】:

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

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

    【讨论】:

    • 尝试使用COPY . /app
    【解决方案2】:

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

    我使用以下命令运行它:

    gunicorn -k uvicorn.workers.UvicornWorker run:app

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2020-08-02
      • 2022-12-21
      • 2022-07-15
      • 2021-06-04
      • 2018-11-17
      • 2019-03-22
      相关资源
      最近更新 更多