Python 3.x 在UWSGI中未找到烧瓶模块
我正在运行一个docker容器来承载一个flask应用程序,docker文件如下Python 3.x 在UWSGI中未找到烧瓶模块,python-3.x,docker,flask,uwsgi,Python 3.x,Docker,Flask,Uwsgi,我正在运行一个docker容器来承载一个flask应用程序,docker文件如下 FROM python:3.7.7-alpine3.11 ENV FLASK_APP api.app:app RUN apk add --no-cache mariadb-dev RUN apk add --no-cache gcc musl-dev RUN apk add --no-cache uwsgi-python3 uwsgi-http bash RUN adduser -D api USER api
FROM python:3.7.7-alpine3.11
ENV FLASK_APP api.app:app
RUN apk add --no-cache mariadb-dev
RUN apk add --no-cache gcc musl-dev
RUN apk add --no-cache uwsgi-python3 uwsgi-http bash
RUN adduser -D api
USER api
SHELL [ "/bin/bash", "-c" ]
WORKDIR /home/api
COPY . .
RUN python -m venv venv
RUN venv/bin/pip install -r requirements/requirements.txt
RUN venv/bin/pip install .
# run-time configuration
EXPOSE 5000
ENTRYPOINT [ "./boot.sh" ]
exec uwsgi --plugins http,python3 --http :5000 -b 32768 --http-keepalive --thunder-lock --manage-script-name --mount /=myapp.app:app --lazy-apps --die-on-term -H venv
boot.sh的代码如下所示
FROM python:3.7.7-alpine3.11
ENV FLASK_APP api.app:app
RUN apk add --no-cache mariadb-dev
RUN apk add --no-cache gcc musl-dev
RUN apk add --no-cache uwsgi-python3 uwsgi-http bash
RUN adduser -D api
USER api
SHELL [ "/bin/bash", "-c" ]
WORKDIR /home/api
COPY . .
RUN python -m venv venv
RUN venv/bin/pip install -r requirements/requirements.txt
RUN venv/bin/pip install .
# run-time configuration
EXPOSE 5000
ENTRYPOINT [ "./boot.sh" ]
exec uwsgi --plugins http,python3 --http :5000 -b 32768 --http-keepalive --thunder-lock --manage-script-name --mount /=myapp.app:app --lazy-apps --die-on-term -H venv
容器在运行时出错
我输入容器(在boot.sh中运行一些其他命令以保持容器正常运行)
docker exec-it sh
试着运行上面的命令,它会给我下面的错误
Traceback (most recent call last):
File "./query_api/app.py", line 2, in <module>
from flask import Flask, jsonify
ModuleNotFoundError: No module named 'flask'
unable to load app 0 (mountpoint='/') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
Python version: 3.8.2 (default, Feb 29 2020, 17:03:31) [GCC 9.2.0]
!!! Python Home is not a directory: root/test !!!
Set PythonHome to root/test
Python path configuration:
PYTHONHOME = 'home/venv'
PYTHONPATH = '/home/venv'
program name = 'home/venv/bin/python'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = '/home/api/home/venv/bin/python'
sys.base_prefix = 'home/venv'
sys.base_exec_prefix = 'home/venv'
sys.executable = '/home/api/home/venv/bin/python'
sys.prefix = 'home/venv'
sys.exec_prefix = 'home/venv'
sys.path = [
'home/venv/lib/python38.zip',
'home/venv/lib/python3.8',
'home/venv/lib/python3.8/lib-dynload',
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00007f8034d60d48 (most recent call first):
<no Python frame>
我在某处读到我们必须提供蟒蛇
导出PYTHONPATH=/home/api/venv/
然后当我执行uwsgi命令时,我得到以下错误
Traceback (most recent call last):
File "./query_api/app.py", line 2, in <module>
from flask import Flask, jsonify
ModuleNotFoundError: No module named 'flask'
unable to load app 0 (mountpoint='/') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
Python version: 3.8.2 (default, Feb 29 2020, 17:03:31) [GCC 9.2.0]
!!! Python Home is not a directory: root/test !!!
Set PythonHome to root/test
Python path configuration:
PYTHONHOME = 'home/venv'
PYTHONPATH = '/home/venv'
program name = 'home/venv/bin/python'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = '/home/api/home/venv/bin/python'
sys.base_prefix = 'home/venv'
sys.base_exec_prefix = 'home/venv'
sys.executable = '/home/api/home/venv/bin/python'
sys.prefix = 'home/venv'
sys.exec_prefix = 'home/venv'
sys.path = [
'home/venv/lib/python38.zip',
'home/venv/lib/python3.8',
'home/venv/lib/python3.8/lib-dynload',
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00007f8034d60d48 (most recent call first):
<no Python frame>
app.py包含一个简单的hello world程序。
在过去的两天里,我一直在为调试flask和uwsgi而努力。非常感谢您的帮助。您为什么要在Docker内部使用
virtualenv
?对我来说,这似乎是一种反模式。您可以使用virtualenv
将依赖项与其他应用程序或系统本身隔离开来,这与使用Docker实现的功能相同。也许如果你简化你的Dockerfile,你可能会解决你的问题。嗨,Stefan,谢谢。但我正在尝试复制我同事的一个项目,对他来说,设置(旧的阿尔卑斯版本)运行良好。不过,我会尝试不使用虚拟环境,并让您知道。然而,根据我的理解,同样的问题也可能发生在本地机器虚拟环境中。我同意,同样的问题也可能发生在本地开发过程中。通常,使用Docker(我将以python为例)时的开发过程是使用virtualenv
在本地开发应用程序,确保一切正常。之后,使用本地开发期间使用的相同命令对应用程序进行容器化,但在本例中不使用virutalenv
,因为这只是开销。最后,当您确定容器的所有功能都能正常工作时,您就可以优化映像了。我在没有docker的本地linux系统上进行了尝试,但仍然得到了相同的问题威尔,这将是一个flask/python问题。:)为什么在Docker内部使用virtualenv
?对我来说,这似乎是一种反模式。您可以使用virtualenv
将依赖项与其他应用程序或系统本身隔离开来,这与使用Docker实现的功能相同。也许如果你简化你的Dockerfile,你可能会解决你的问题。嗨,Stefan,谢谢。但我正在尝试复制我同事的一个项目,对他来说,设置(旧的阿尔卑斯版本)运行良好。不过,我会尝试不使用虚拟环境,并让您知道。然而,根据我的理解,同样的问题也可能发生在本地机器虚拟环境中。我同意,同样的问题也可能发生在本地开发过程中。通常,使用Docker(我将以python为例)时的开发过程是使用virtualenv
在本地开发应用程序,确保一切正常。之后,使用本地开发期间使用的相同命令对应用程序进行容器化,但在本例中不使用virutalenv
,因为这只是开销。最后,当您确定容器的所有功能都能正常工作时,您就可以优化映像了。我在没有docker的本地linux系统上进行了尝试,但仍然得到了相同的问题威尔,这将是一个flask/python问题。:)