Как стать автором
Обновить
1216.02
Рейтинг
VDSina.ru
Серверы в Москве и Амстердаме

Как превратить скрипт на Python в «настоящую» программу при помощи Docker

VDSina.ruPythonПрограммированиеМикросервисы
Перевод
Автор оригинала: Adam Cyber
Никого не интересует, умеете ли вы разворачивать связанный список — всем нужно, чтобы можно было легко запускать ваши программы на их машине. Это становится возможным благодаря Docker.


Для кого предназначена эта статья?


Вам когда-нибудь передавали код или программу, дерево зависимостей которой напоминает запутанную монтажную плату?


Как выглядит управление зависимостями

Без проблем, я уверен, что разработчик любезно предоставил вам скрипт установки, чтобы всё работало. Итак, вы запускаете его скрипт, и сразу же видите в оболочке кучу сообщений логов ошибок. «У меня на машине всё работало», — обычно так отвечает разработчик, когда вы обращаетесь к нему за помощью.

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

В частности, мы рассмотрим скрипты, которые должны работать как фоновый процесс.

Репозитории Github и Docker


Если вам более удобна наглядность, то изучите репозитории Github и Docker, где будет хоститься этот код.

Но… почему Docker?


Контейнеризацию можно сравнить с размещением вашего ПО в грузовом контейнере, обеспечивающем стандартный интерфейс для компании-грузоперевозчика (или другого компьютера-хоста), который позволяет взаимодействовать с ПО.

Контейнеризация приложений на самом деле является золотым стандартом портируемости.


Общая схема Docker/контейнеризации

Контейнеризация (особенно при помощи docker) открывает перед вашим программным приложением огромные возможности. Правильно контейнеризированное (например, докеризированное) приложение можно развёртывать с возможностью масштабирования через Kubernetes или Scale Sets любого поставщика облачных услуг. И да, об этом мы тоже поговорим в следующей статье.

Наше приложение


В нём не будет ничего особо сложного — мы снова работаем с простым скриптом, отслеживающим изменения в каталоге (так как я работаю в Linux, это /tmp). Логи будут передаваться на stdout, и это важно, если мы хотим, чтобы они отображались в логах docker (подробнее об этом позже).


main.py: простое приложение мониторинга файлов

Эта программа будет выполняться бесконечно.

Как обычно, у нас есть файл requirements.txt с зависимостями, на этот раз только с одной:


requirements.txt

Создаём Dockerfile


В моей предыдущей статье мы создали скрипт процесса установки в Makefile, благодаря чему им очень легко делиться. На этот раз мы сделаем нечто подобное, но уже в Docker.


Dockerfile

Нам необязательно вдаваться в подробности устройства и работы Dockerfile, об этом есть более подробные туториалы.

Краткое описание Dockerfile — мы начинаем с базового образа, содержащего полный интерпретатор Python и его пакеты, после чего устанавливаем зависимости (строка 6), создаём новый минималистичный образ (строка 9), копируем зависимости и код в новый образ (строки 13–14; это называется многоэтапной сборкой, в нашем случае это снизило размер готового образа с 1 ГБ до 200 МБ), задаём переменную окружения (строка 17) и команду исполнения (строка 20), на чём и завершаем.

Сборка образа


Завершив с Dockerfile, мы просто выполняем из каталога нашего проекта следующую команду:

sudo docker build -t directory-monitor .


Собираем образ

Запуск образа


После завершения сборки можно начинать творить магию.

Один из самых замечательных аспектов Docker заключается в том, что он предоставляет стандартизованный интерфейс. Так что если вы правильно спроектируете свою программу, то передавая её кому-то другому, достаточно будет сказать, что нужно изучить docker (если человек ещё его не знает), а не обучать его тонкостям устройства вашей программы.

Хотите увидеть, что я имею в виду?

Команда для запуска программы выглядит примерно так:


Здесь многое нужно объяснить, поэтому разобьём на части:

-d — запуск образа в detached mode, а не в foreground mode

--restart=always — при сбое контейнера docker он перезапустится. Мы можем восстанавливаться после аварий, ура!

--e DIRECTORY='/tmp/test' — мы передаём при помощи переменных окружения каталог, который нужно отслеживать. (Также мы можем спроектировать нашу программу на python так, чтобы она считывала аргументы, и передавать отслеживаемый каталог таким способом.)

-v /tmp/:/tmp/ — монтируем каталог /tmp в каталог /tmp контейнера Docker. Это важно: любой каталог, который мы хотим отслеживать, ДОЛЖЕН быть видимым нашим процессам в контейнере docker, и именно так это реализуется.

directory-monitor — имя запускаемого образа

После запуска образа его состояние можно проверять с помощью команды docker ps:


Вывод docker ps

Docker создаёт crazy-имена для запущенных контейнеров, потому что люди не очень хорошо запоминают значения хэшей. В данном случае имя crazy_wozniak относится к нашему контейнеру.

Теперь, поскольку мы отслеживаем /tmp/test на моей локальной машине, если я создам в этом каталоге новый файл, то это должно отразиться в логах контейнера:


Логи Docker демонстрируют, что приложение работает правильно

Вот и всё, теперь ваша программа докеризирована и запущена на вашей машине. Далее нам нужно решить проблему передачи программы другим людым.

Делимся программой


Ваша докеризированная программа может пригодиться вашим коллегам, друзьям, вам в будущем, да и кому угодно в мире, поэтому нам нужно упростить её распространение. Идеальным решением для этого является Docker hub.

Если у вас ещё нет аккаунта, зарегистрируйтесь, а затем выполните логин из cli:


Логинимся в Dockerhub

Далее пометим и запушим только что созданный образ в свой аккаунт.


Добавляем метку и пушим образ


Теперь образ находится в вашем аккаунте docker hub

Чтобы убедиться, что всё работает, попробуем выполнить pull этого образа и использовать в сквозном тестировании всей проделанной нами работы:


Сквозное тестирование нашего образа docker

Весь этот процесс занял всего 30 секунд.

Что дальше?


Надеюсь, мне удалось убедить вас в потрясающей практичности контейнеризации. Docker останется с нами надолго, и чем раньше вы его освоите, тем больше получите преимуществ.

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

Источники






На правах рекламы


Вдсина предлагает виртуальные серверы на Linux или Windows. Используем исключительно брендовое оборудование, лучшую в своём роде панель управления серверами собственной разработки и одни из лучших дата-центров в России и ЕС. Поспешите заказать!

Теги:PythonDockerкодингpython3
Хабы: VDSina.ru Python Программирование Микросервисы
Всего голосов 47: ↑37 и ↓10 +27
Просмотры18.7K

Похожие публикации

Лучшие публикации за сутки

Информация

Дата основания
Местоположение
Россия
Сайт
vdsina.ru
Численность
11–30 человек
Дата регистрации
Представитель
Mikhail

Блог на Хабре