首页 > 解决方案 > 在 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 的新手。非常感谢任何帮助。

标签: python-3.xdockerflaskuwsgi

解决方案


推荐阅读