如何解决仅在部署期间自定义模块导入错误
Dockerfile
requirements.txt
caller --> app.py
--> user.py
--> templates
--> static
我正在 Flask
中初始化并运行我的 app.py
应用:
app.py
from twilio.rest import Client
import sys,os
...
from user import User,Anonymous
app = Flask(__name__)
...
def create_app():
app.run(debug=True,host='0.0.0.0',port=5005)
当我在本地运行我的应用程序时,它工作正常,但是当我尝试制作图像并运行图像时,它给了我一个错误:
File "/caller/caller/app.py",line 11,in <module>
from user import User,Anonymous
ModuleNotFoundError: No module named 'user'
dockerfile
FROM python:3.7.5-slim-buster
ENV INSTALL_PATH /caller
RUN mkdir -p $INSTALL_PATH
workdir $INSTALL_PATH
copY requirements.txt requirements.txt
RUN pip install -r requirements.txt
RUN pip install flask_login
copY . .
CMD gunicorn -b 0.0.0.0:8000 --access-logfile - "caller.app"
user.py
import uuid
class User():
...
class Anonymous():
...
你知道我该如何解决这个问题吗?这也是我的第一个 Dockerfile
,这可能是问题所在。为了构建和运行我正在做的图像docker build -t foo . && docker run -it foo
解决方法
Python 的导入系统通过在解释器定义的路径列表中搜索模块来工作。您可以通过选中 sys.path
来查看此列表。如果您查看 documentation,path[0]
处的第一项是包含您从中调用解释器的脚本的目录。
您通过从您在 Dockerfile 中设置的工作目录 gunicorn
运行 /caller
来调用 Python。所以这是 Python 在 path[0]
中用于导入系统的基本目录。因此,当遇到 from user import User,Anonymous
行时,Python 会尝试从 /caller
导入它,其中包含您的 Dockerfile、requirements.txt 和您复制到的 /caller/ 目录(通过 COPY . .
在您的 Dockerfile 中)。所以包位于 /caller/caller/user.py
而不是 /caller/user.py
...导入系统没有看到它,你会得到你的错误。
您可以通过两种方式修复:
1. 更改您的代码以使用相对导入。这将告诉 Python 导入系统在同一目录中查找:
from .user import User,Anonymous
2.您还可以通过更改 Dockerfile 将 /caller
的内容复制到容器中的 /caller
工作目录而不是递归 {{ 1}} 调用你复制所有内容。
用 COPY . .
替换 COPY . .
并更新 COPY caller .
以仅调用 gunicorn
而不是 app
(因为它不再嵌套在第二个调用者目录中)。
现在,user.py 将位于您容器中的 caller.app
,Python 导入系统会在检查 /caller/user.py
时找到它
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。