Python: Сборка образа Docker — проблема с «Werkzeug» 🤖!

Я столкнулся с тем, что сборка образа 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"
Enter fullscreen mode Выйти из полноэкранного режима

После завершения:

root@64be4aeb190a:/flask_restx_demo# exit
Войти в полноэкранный режим Выйти из полноэкранного режима

✿✿✿

Хотя я так и не смог понять, почему устанавливаются разные версии Werkzeug… Я рад, что выяснил, что версии вызывают ошибку импорта. Я надеюсь, что вы нашли этот пост полезным, спасибо за чтение и счастливого докеринга 🙀!

Оцените статью
devanswers.ru
Добавить комментарий