python-3.x - 在 UWSGI 中找不到 Flask 模块
问题描述
我正在运行一个 docker 容器来托管一个烧瓶应用程序,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
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" ]
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 <containerid> 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 ***
我看到了多个stackoverflow查询,发现我们必须设置虚拟环境的正确路径我也这样做了,但得到了同样的错误
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 /home/api/venv
我在某处读到我们必须提供 PYTHONPATH。
export PYTHONPATH=/home/api/venv/
然后当我执行 uwsgi 命令时出现以下错误
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>
我不确定它从哪里挑选 python 3.8。我使用 python -V 检查了 python 版本并将其作为
~ $ python -V
Python 3.7.7
~ $
app.py 包含一个简单的 hello world 程序。我从过去 2 天开始一直在努力调试,因为我是烧瓶和 uwsgi 的新手。非常感谢任何帮助。
解决方案
推荐阅读
- api - 调用涂鸦智能API,调用接口报错码:1106,权限被拒绝,如何解决?
- python-sphinx - 如何链接 reStructuredText 中的重复目标?
- python - Locust-重复用户列表
- python - amazon iam 在 boto3 中获得内联政策声明
- sql - 如何计算所有行的中位数?
- django - 使用本地包在 Microsoft Azure 上部署 Django 应用
- c++ - github操作中的cpplinter
- javascript - 如何在 Javascript 中不显示 URL 的情况下创建链接?
- javascript - 我的 NativeBase 结果的标题组件是空的并且不在顶部
- python - 字典理解失败 - Python 3.6.x