Найти в Дзене
Николай Калюжный

Как контейнеризировать скрипт Python с помощью контейнеров разработки?

Оглавление

Контейнер разработки — это, по сути, контейнерная среда разработки, обычно с использованием Docker. Это помогает обеспечить согласованность между различными конфигурациями разработки, облегчая работу нескольких разработчиков над одним и тем же проектом, не сталкиваясь с проблемами типа «это работает на моем компьютере». Этот контейнер включает в себя все необходимые инструменты, расширения и настройки для проекта.

В этой статье блога давайте углубимся в то, что такое DevContainers и как вы можете использовать их в своей разработке на Python.

Какую проблему это решает?

Основная проблема, которую решают Dev Containers, — это несогласованность между средами разработки в командных проектах. Представьте себе, что один разработчик пишет код на Python, который идеально работает на его машине, но когда другой член команды пытается это сделать, он получает ошибки. Часто это связано с различиями в операционных системах, установленных библиотеках или версиях программного обеспечения.

Dev Containers устраняет эту проблему, создавая стандартизированную контейнерную среду. Это единообразие гарантирует, что код Python будет работать одинаково для всех, независимо от индивидуальных настроек компьютера. Это также упрощает процесс адаптации для новых членов команды, поскольку они могут сразу приступить к программированию без хлопот, связанных с настройкой среды разработки в соответствии со спецификациями команды.

Недавно я столкнулся с проблемой во время работы над Network Automation. Я разработал простой скрипт для подключения к нескольким устройствам Cisco с помощью Netmiko. Затем он использовал ntc_templates (с TextFSM) для анализа вывода, а затем выполнил некоторые действия на основе вывода. На моем ноутбуке это работало как по волшебству - настоящий момент "ура". Но когда я поделился скриптом с коллегой, он сразу же провалился. Мы быстро поняли корень проблемы, у нас были разные версии Python и библиотеки.

Этот опыт привел меня к созданию DevContainer для нашей команды. При таком подходе все работают в идентичной среде разработки, обеспечивая согласованное выполнение скриптов на разных компьютерах.

Что насчет Python venv?

Виртуальная среда на языке Python (venv) — это отличный инструмент для управления зависимостями пакетов для отдельных проектов. Однако в первую очередь он ориентирован на изоляцию пакетов Python и их версий. Docker, с другой стороны, идет на шаг дальше. Он изолирует не только зависимости, но и всю среду выполнения. Это означает, что с Docker вы получаете согласованную и более полную среду, которая включает в себя определенные версии системных библиотек, системных инструментов и других настроек. Это особенно полезно, когда необходимо обеспечить одинаковое выполнение приложения в разных средах, таких как разработка, тестирование и производство.

Контейнеры разработки с Visual Studio Code

Расширение Visual Studio Code Dev Containers позволяет использовать контейнер в качестве полнофункциональной среды разработки. Он позволяет открыть любую папку внутри контейнера и воспользоваться полным набором функций Visual Studio Code. A devcontainer.json в проекте сообщает VS Code, как получить доступ к контейнеру разработки (или создать) его с помощью четко определенного инструмента и стека времени выполнения. Этот контейнер можно использовать для запуска приложения или для выделения инструментов, библиотек или сред выполнения, необходимых для работы с кодовой базой.

В нашем примере цель состоит в том, чтобы создать контейнер с уже установленным Python. Кроме того, мы хотим, чтобы он автоматически устанавливал необходимые пакеты pip при запуске контейнера. Я собираюсь использовать простой скрипт на Python, чтобы продемонстрировать это, и, надеюсь, вы сможете следить за ним.

Расширение контейнера разработки

В Visual Studio Code настройка DevContainers начинается с установки расширения Dev Container. Это простой процесс. Сначала откройте редактор VS Code и перейдите в вид Расширения, нажав на квадратный значок на левой боковой панели. В строке поиска введите «Dev Containers». Это расширение от Microsoft должно появиться в результатах поиска. Нажмите "Установить", чтобы добавить его в свой VS Code.

Пример Netmiko

Для этого примера я создал директорию с двумя файлами в ней: cisco.py и requirements.txt Скрипт Python хорошо работает локально на моем компьютере, но наша цель — контейнеризировать его. Прежде чем мы продолжим, давайте посмотрим на два файла.

-2

from netmiko import ConnectHandler

switch_01 = { 'device_type': 'cisco_ios', 'host': '10.10.1.50', 'username': 'admin', 'password': 'cisco123'
}
connection = ConnectHandler(**switch_01) output = connection.send_command('show interface status') connection.disconnect()
print(output)

netmiko==4.3.0

Следующим шагом будет добавление конфигурационных файлов контейнера разработки в эту директорию. После установки расширения вы можете приступить к созданию контейнера разработки Python. Для этого откройте папку проекта в VS Code, а затем > Просмотреть палитру команд. Введите «Контейнеры разработки: добавьте файлы конфигурации контейнера разработки...» и выберите его.

-3

Появится список предопределенных конфигураций контейнера. Выберите «Python 3», чтобы получить контейнер с предустановленным Python. Это действие создаст объект .devcontainer в вашем проекте с помощью devcontainer.json файл. Файл определяет среду контейнера, включая версию Python и любые дополнительные инструменты или расширения, которые вам нужны. Тем devcontainer.json позволяет указать дополнительные конфигурации, такие как переадресация портов и настройка переменных среды.

-4
-5

-6

Давайте посмотрим на devcontainer.json файл. В нем указывается базовый образ для контейнера, в данном случае среда Python 3, использующая образ mcr.microsoft.com/devcontainers/python:1-3.12-bullseye. Этот образ представляет собой предварительно настроенную среду, которая включает Python и готова к использованию.

// For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/python { "name": "Python 3", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye",
// Features to add to the dev container. More info: https://containers.dev/features. // "features": {},
// Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "pip3 install --user -r requirements.txt"
// Configure tool-specific properties. // "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" }

Одна из ключевых частей нашего devcontainer.json является ли метод postCreateCommand. Эта команда выполняется автоматически после настройки контейнера. В нашем случае это pip3 install --user -r requirements.txt. Эта команда указывает контейнеру установить пакеты, перечисленные в разделе requirements.txt Как только контейнер будет готов. Он гарантирует, что все необходимые пакеты Python, включая Netmiko, установлены в контейнерной среде.

Теперь давайте настроим и запустим наш контейнер. В Visual Studio Code, открыв проект, просто нажмите кнопку "Повторно открыть в контейнере". Это действие предлагает VS Code извлечь указанное изображение из папки devcontainer.json и настройте контейнерное окружение за вас. Это бесшовный процесс, в котором все настраивается в фоновом режиме.

-7

💡

Если вы не видите опцию «Повторно открыть в контейнере», нажмите на опцию «Контейнер разработки: Python 3» в левом нижнем углу и выберите «Повторно открыть в контейнере»'

Как только вы окажетесь внутри контейнера, вы обнаружите, что Python предустановлен, а все необходимые пакеты перечислены в вашем requirements.txt, уже установлены. Эта конфигурация полностью изолирована от реального терминала или локальной среды, что обеспечивает согласованное и контролируемое пространство разработки.

Чтобы убедиться, что все в порядке, вы можете запустить проверку версии Python, а также проверить версию Netmiko. Эти проверки подтверждают, что контейнер правильно настроен с нужными вам инструментами. Помните, что то, что вы видите и с чем работаете внутри этого контейнера, отделено от локальной среды вашего компьютера. Это похоже на наличие выделенной виртуальной машины без какого-либо вмешательства извне или установки.

vscode ➜ /workspaces/dve_container_python $ python --version
Python 3.12.1
vscode ➜ /workspaces/dve_container_python $ pip list | grep netmiko
netmiko 4.3.0

Мой скрипт Nemiko также работает должным образом 🙂

vscode ➜ /workspaces/dve_container_python $ python cisco.py

Port Name Status Vlan Duplex Speed Type
Gi0/0 connected 2 a-full auto RJ45
Gi0/1 connected 1 a-full auto RJ45
Gi0/2 connected 1 a-full auto RJ45
Gi0/3 notconnect 1 a-full auto RJ45
Gi1/0 notconnect 1 a-full auto RJ45
Gi1/1 notconnect 1 a-full auto RJ45
Gi1/2 notconnect 1 a-full auto RJ45
Gi1/3 notconnect 1 a-full auto RJ45

Заключение

В заключение, использование DevContainers, особенно с Visual Studio Code, предлагает согласованную среду разработки для проектов Python, как в нашем примере с Netmiko. Такой подход не только упрощает процесс настройки, но и гарантирует, что все члены команды работают с одними и теми же инструментами и конфигурациями, избегая распространенной проблемы «это работает на моем компьютере».