Я запускаю контейнер 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. Любая помощь очень ценится.