Контейнерная разработка на Python - часть 3
Last updated
Was this helpful?
Last updated
Was this helpful?
Оригинал статьи:
Это последняя часть в серии сообщений в блоге, показывающих, как настроить и оптимизировать контейнерную среду разработки Python. В первой части рассказывалось о том, как контейнеризовать службу Python и о лучших практиках разработки для нее. Вторая часть показала, как легко настроить различные компоненты, необходимые нашему приложению Python, и как легко управлять жизненным циклом всего проекта с помощью Docker Compose.
В этой заключительной части мы рассмотрим цикл разработки проекта и более подробно обсудим, как применять обновления кода и отлаживать сбои контейнерных служб Python. Цель состоит в том, чтобы проанализировать, как ускорить эти повторяющиеся фазы процесса разработки, чтобы получить опыт, аналогичный опыту локальной разработки.
В общем, наш цикл контейнерной разработки состоит из написания / обновления кода, сборки, запуска и отладки.
Что касается этапов сборки и выполнения, поскольку большую часть времени нам фактически приходится ждать, мы хотим, чтобы эти этапы проходили довольно быстро, чтобы мы сосредоточились на кодировании и отладке.
Теперь мы проанализируем, как оптимизировать этап сборки во время разработки. Фаза сборки соответствует времени сборки изображения, когда мы изменяем исходный код Python. Образ необходимо перестроить, чтобы получить обновления кода Python в контейнере перед его запуском.
Однако мы можем применить изменения кода без создания образа. Мы можем сделать это, просто подключив локальный исходный каталог к его пути в контейнере. Для этого мы обновляем файл набора следующим образом:
Благодаря этому у нас есть прямой доступ к обновленному коду, и поэтому мы можем пропустить сборку образа и перезапустить контейнер, чтобы перезагрузить процесс Python.
Кроме того, мы можем избежать повторного запуска контейнера, если запустим внутри него процесс перезагрузки, который отслеживает изменения файлов и запускает перезапуск процесса Python после обнаружения изменения. Нам нужно убедиться, что мы установили привязку исходного кода в файле Compose, как описано ранее.
В нашем примере мы используем фреймворк Flask, который в режиме отладки запускает очень удобный модуль, называемый reloader. Перезагрузчик просматривает все файлы исходного кода и автоматически перезапускает сервер, когда обнаруживает, что файл был изменен. Чтобы включить режим отладки, нам нужно только установить параметр отладки, как показано ниже:
Если мы проверим журналы контейнера приложения, мы увидим, что сервер flask работает в режиме отладки.
После обновления исходного кода и сохранения мы должны увидеть уведомление в журналах и перезагрузиться.
Мы можем отлаживать код двумя способами.
Во-первых, это старомодный способ размещения операторов печати по всему коду для проверки значений объектов / переменных во время выполнения. Применять это к контейнерным процессам довольно просто, и мы можем легко проверить вывод с помощью команды docker-compose logs.
Во-вторых, более серьезный подход - использование отладчика. Когда у нас есть контейнерный процесс, нам нужно запустить отладчик внутри контейнера, а затем подключиться к этому удаленному отладчику, чтобы иметь возможность проверять данные экземпляра.
Мы снова возьмем в качестве примера наше приложение Flask. При работе в режиме отладки, помимо модуля перезагрузки, он также включает интерактивный отладчик. Предположим, мы обновляем код, чтобы вызвать исключение, служба Flask вернет подробный ответ с исключением.
Еще один интересный случай для упражнений - интерактивная отладка, когда мы помещаем точки останова в код и выполняем проверку в реальном времени. Для этого нам понадобится IDE с Python и поддержкой удаленной отладки. Если мы решим полагаться на Visual Studio Code, чтобы показать, как отлаживать код Python, работающий в контейнерах, нам нужно сделать следующее, чтобы подключиться к удаленному отладчику непосредственно из VSCode.
Во-первых, нам нужно локально отобразить порт, который мы используем для подключения к отладчику. Мы можем легко сделать это, добавив отображение порта в файл Compose:
Затем нам нужно импортировать модуль отладчика в исходный код и заставить его прослушивать порт, который мы определили в файле Compose. Мы не должны забывать также добавить его в файл зависимостей и перестроить образ для службы приложения, чтобы установить пакет отладчика. Для этого упражнения мы решили использовать пакет отладчика ptvsd, который поддерживает VS Code.
Нам нужно помнить, что для изменений, которые мы вносим в файл Compose, нам нужно запустить команду compose down, чтобы удалить текущую настройку контейнеров, а затем запустить docker-compose up для повторного развертывания с новыми конфигурациями в файле compose.
Наконец, нам нужно создать конфигурацию «Remote Attach» в VS Code, чтобы запустить режим отладки.
Файл launch.json для нашего проекта должен выглядеть так:
Нам нужно убедиться, что мы обновляем карту путей локально и в контейнере.
Как только мы это сделаем, мы сможем легко разместить точки останова в среде IDE, запустить режим отладки на основе созданной конфигурации и, наконец, запустить код для достижения точки останова.
Образец проекта
Лучшие практики для написания Dockerfile
Docker Desktop
Docker Compose
Образцы шаблонов проекта
В этой показано, как быстро настроить контейнерную среду разработки Python, управлять жизненным циклом проекта, применять обновления кода и отлаживать контейнерные службы Python. Применение на практике всего, что мы обсуждали, должно сделать опыт контейнерной разработки идентичным локальному.