Flask Модуль не найден в UWSGI - PullRequest
0 голосов
/ 18 марта 2020

Я запускаю контейнер 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

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" ]

код для загрузки. 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

Контейнер выдает ошибку во время работы.

Я вхожу в контейнер (запускаю какую-то другую команду при загрузке. 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 версию, используя python -V, и получил ее как

~ $ python -V
Python 3.7.7
~ $

. App.py содержит простую программу hello world. Я борюсь за последние 2 дня, чтобы отладить так же, как я новичок в flask и UWSGI. Любая помощь очень ценится.

...