Я столкнулся с тем, что сборка образа Docker установила другую версию пакета зависимостей Werkzeug, чем процесс установки, редактируемый разработчиками. Это привело к тому, что проект Python в образе Docker не запустился. Редактируемая для разработки установка означает выполнение команды «pip3 install -e .» в активной виртуальной среде. Я описываю проблему и способы ее решения в этом посте.
Среды в этом посте: ⓵ Windows 10 Pro версии 10.0.19044 Build 19044. ⓶ docker CLI версии 20.10.12, сборка e91ed57.
Обратите внимание, что код Python в этом посте является продолжением кода, использованного в посте Python: интерактивная оболочка и декоратор shell_context_processor()., код которого можно клонировать:
git clone -b v1.0.1 https://github.com/behai-nguyen/flask-restx-demo.git
✿✿✿
Примерно 20/июля/2022 я выполнил сборку Docker для этого проекта Python, используя редактируемый шаг сборки образа install: RUN pip3 install -e … Я смог успешно запустить этот образ. Фактически, я использовал его для изучения томов Docker: Я запускал и останавливал запуск несколько раз. Я на 100% уверен, что это сработало. После этого я удалил все контейнеры, образы и тома.
Я вручную записывал все основные команды и их результаты в текстовый файл — я до сих пор это делаю. 24/июля/2022 я повторил то, что делал ранее: сборка сработала, но запуск образа привел к ошибке импорта!
Команда для сборки:
F:flask_restx_demo>docker build --tag flask-restx-demo .
Команда для запуска:
F:flask_restx_demo>docker run --publish 8000:8000 --rm flask-restx-demo
ImportError: cannot import name ‘parse_rule’ from ‘werkzeug.routing’ (/usr/local/lib/python3.10/site-packages/werkzeug/routing/init.py).
Полный журнал см. на снимке экрана ниже:
После возникновения ошибки я смог понять, в чем проблема. Внутри образа Docker версия Werkzeug была 2.2.0, а в среде разработки — 2.1.2. Я опишу, как я это сделал, в следующем разделе Как заглянуть внутрь образа Docker.
Пакет Werkzeug, в моем понимании, является пакетом зависимостей. Он устанавливается автоматически, когда это требуется пакетами, которые мы указываем. Обычно нам не нужно явно указывать пакет Werkzeug в качестве требуемого пакета.
За эти почти четыре ( 4 ) дня единственное значительное изменение было в кодах Python, где я включил кросс-оригинальный AJAX с помощью пакета Flask-Cors. Насколько я понимаю, этот пакет не должен вызывать установку другой версии пакета Werkzeug?
Я также должен упомянуть, что на моей Windows 10 Pro версия Python составляет 3.10.1; в то время как для сборки образа она составляет 3.10.5: FROM python:3.10.5-slim-buster.
— Но эта конфигурация не была изменена в течение этих почти четырех (4) дней.
Поиск в Google показал, что у других тоже были проблемы с версиями зависимостей Werkzeug, и они должны были явно указать правильную версию в списке необходимых пакетов. Поэтому я подумал, что если я заставлю среду разработки явно установить версию 2.2.0, то она выдаст ошибку импорта, как это делает образ Docker.
Я обновил секцию install_requires в setup.py, включив в нее в качестве последней записи ‘werkzeug==2.2.0’:
install_requires=[
'Flask',
'python-dotenv',
'Flask-RESTX',
'Flask-SQLAlchemy',
'Flask-Cors',
'werkzeug==2.2.0',
],
Повторно запустите редактируемую установку:
(venv) F:flask_restx_demo>pip3 install -e .
Затем запустите проект:
(venv) F:flask_restx_demo>venvScriptsflask.exe run
Я получил ожидаемую ошибку. Пожалуйста, смотрите снимок экрана ниже:
ImportError: cannot import name ‘parse_rule’ from ‘werkzeug.routing’ (F:flask_restx_demovenvlibsite-packageswerkzeugrouting_init_.py)
Исходя из этого, я ожидал, что если я изменю Werkzeug на версию 2.1.2, то образ Docker должен работать. Среда разработки уже работает, как мы видели ранее.
setup.py’s install_requires теперь:
install_requires=[
...
'werkzeug==2.1.2',
],
❶ Переустановите необходимые пакеты в редактируемом режиме, проект запустится с сервером разработки Flask, как и раньше. ❷ Пересоберите и запустите заново образ Docker — он работает.
Обратите внимание, что при запуске с:
F:flask_restx_demo>docker run --publish 8000:8000 --rm flask-restx-demo
Тогда URL-адреса для контейнера будут такими:
http://0.0.0.0:8000/api/v1/ui -- Swagger UI URL
http://0.0.0.0:8000/api/v1/trees -- API URL
Последний код этого поста может быть клонирован с помощью:
git clone -b v1.0.2 https://github.com/behai-nguyen/flask-restx-demo.git
Пожалуйста, обратите внимание, я включил два (2) тестовых клиента в раздел test_client_app. ⓵ test_client_appdelphi — это простой проект Delphi 10.4 Community, вам придется компилировать его самостоятельно. ⓶ test_client_appjquery-ajaxTreeAPIClient.html — это страница JQuery, просто скопируйте ее на веб-сайт или в виртуальный веб-каталог и запустите оттуда.
Как заглянуть внутрь образа Docker
Запустите контейнер в интерактивном режиме с помощью процесса bash:
F:flask_restx_demo>docker run -it --rm flask-restx-demo bash
Подсказка изменится на что-то вроде этого:
root@64be4aeb190a:/flask_restx_demo#
Нам понадобится редактор для просмотра файлов. vi не установлен. Мы можем установить его, но нам нужно знать, что это за дистрибутив Linux, запустите:
root@64be4aeb190a:/flask_restx_demo# cat /etc/os-release
Получаем:
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@64be4aeb190a:/flask_restx_demo#
Я искал «install vi debian», и нашел это Как установить редактор vim на Debian 11 — в основном, выполните эти две (2) команды:
root@64be4aeb190a:/flask_restx_demo# apt update
root@64be4aeb190a:/flask_restx_demo# apt install vim
Теперь, когда у нас есть vim, мы можем просматривать файлы. С установленным Werkzeug 2.2.0:
root@64be4aeb190a:/flask_restx_demo# vi /usr/local/lib/python3.10/site-packages/werkzeug/routing/__init__.py
Не определено правило parse_rule!
root@64be4aeb190a:/flask_restx_demo# vi /usr/local/lib/python3.10/site-packages/werkzeug/__init__.py
Последняя строка должна сообщить нам версию:
__version__ = "2.2.0"
После завершения:
root@64be4aeb190a:/flask_restx_demo# exit
✿✿✿
Хотя я так и не смог понять, почему устанавливаются разные версии Werkzeug… Я рад, что выяснил, что версии вызывают ошибку импорта. Я надеюсь, что вы нашли этот пост полезным, спасибо за чтение и счастливого докеринга 🙀!