Работа с Python + Docker
ВАЖНО!!!
Для работы с репозиторием рекомендуется использовать OS Linux, а точнее — репозитории на основе Debian, такие как Ubuntu или Astra Linux. Например, для написания данного материала использовалась ОС Astra Linux Common Edition («Орёл»).
Введение
В данном руководстве будут показаны основные примеры работы с Python + Docker. Здесь рассмотрены следующие случаи:
- Создание и запуск контейнера для простейшего приложения.
- Создание и запуск контейнера для приложения, требующего аргументы командной строки.
- Создание и запуск контейнера для приложения, требующего аргументы командной строки и сохраняющего результат работы в файл в файловой системе родительской ОС.
- Создание и запуск контейнера для приложения с GUI на базе PyQt5.
Получение необходимых данных
Все данные, необходимые для работы, находятся в репозитории на Gitflic. Для начала работы склонируйте репозиторий на свой локальный носитель:
git clone https://gitflic.ru/project/aminodovborisov/py_and_docker.git
Необходимый инструментарий
Для работы с руководством необходимо иметь следующее программное обеспечение:
- Python 3.x (можно скачать последнюю версию с официального сайта).
- Установленные дополнительные пакеты языка Python (такие как
numpy
и другие). - Docker.
- Приложение для разработки ПО — любое удобное для пользователя: nano, kate, mceditor, PyCharm etc.
- Git
Для установки необходимого ПО нужно перейти в терминал и выполнить команду
$ sudo apt install python3 python3-pip docker.io git
Если отсутствует привычный текстовый редактор, его можно установить самостоятельно.
Работа с тестовыми проектами
Обзор тестовых проектов
В состав репозитория входят следующие тестовые проекты:
just_py_libs
— простейший проект с использованием библиотекиnumpy
. Выдаёт 10 строк, каждая из которых содержит случайное количество звёздочек, от 1 до 10.py_args
— проект, в котором количество строк со звёздочками задаётся во входном аргументе.py_savefile
— проект, в котором рисуется пример фрактальной графики. Количество итераций фрактала задаётся входным аргументом, а результат — векторный графический файл — сохраняется в рабочую директорию проекта. При работе с проектом рабочую директорию нужно будет примонтировать к внешней операционной системе, об этом будет рассказано ниже.
Создание файла requirements.txt
Перед началом работы с каждым проектом необходимо создать и заполнить файл requirements.txt, в котором будут перечислены библиотеки, используемые в проекте. Впоследствии эти библиотеки будут установлены в контейнер согласно списку. 1. Создать файл requirements.txt в каталоге проекта. 2. Открыть .py
-файл проекта. В каждом тестовом проекте будет только один файл проекта с этим расширением. 3. Ознакомиться с библиотеками, которые были импортированы. 4. Запросить текущую версию каждой библиотеки с помощью команды pip3 show %package_name%
, например
$ sudo pip3 show numpy
- Добавить в
requirements.txt
строку с названием и текущей версией проекта, например
numpy==1.25.2
Создание Dockerfile
Dockerfile — это файл без расширения, в котором будут описаны команды по созданию контейнера. Простейший Dockerfile для программ на Python выглядит следующим образом:
# Версия языка программирования, на которой был написан исходный код
FROM python:3.11.0
# Указание (и при необходимости создание) рабочего каталога контейнера
WORKDIR /app
# Создание рабочего каталога проекта, в котором может храниться результат работы.
# В программном коде проекта нужно предусмотреть сохранение данных именно в этот каталог.
# По умолчанию команда закомментирована, при необходимости её можно раскомментировать.
# RUN mkdir -p /app/ready_fractal
# Копирование исходного кода в рабочий каталог контейнера
COPY . .
# Установка необходимых библиотек, указанных в файле requirements.txt.
# Файл requirements.txt находится в одном каталоге с Dockerfile,
# поэтому прописывать путь к нему не нужно.
RUN python -m pip install -r requirements.txt
# Команда на запуск приложения.
# Второй элемент массива - это основной python-файл проекта.
# ВАЖНО: для работы в Linux нужно вводить не python, а python3.
# ВАЖНО: кавычки должны быть строго ДВОЙНЫЕ.
CMD ["python", "name_of_pythonfile.py"]
Этот файл нужно сохранить в одной директории с проектом.
Создание образа
Для создания образа нужно выполнить в терминале команду
$ sudo docker build -t %имя-образа% %путь-к-Dockerfile%
Во всех рассмотренных случаях команда на создание образа будет отдаваться непосредственно из директории проекта (следовательно, из директории, в которой находится Dockerfile). Поэтому путь к Dockerfile будет представлять собой только точку — .
. В ходе создания образа Docker будет следовать указаниям, указанным в Dockerfile. О выполнении того или иного указания будет выводиться соответствующая информация. В конце создания образа Docker выдаст сообщение «What’s Next?» — это свидетельствует об успешном создании образа. После создания контейнера можно ознакомиться со списком текущих контейнеров с помощью команды docker images
. Примерный список контейнеров выглядит следующим образом:
REPOSITORY TAG IMAGE ID CREATED SIZE
fractal latest a6adbb0a07cf 8 seconds ago 1.01GB
<none> <none> 9338537564e4 32 minutes ago 1.01GB
argstars latest 5836691a6fc5 2 hours ago 1.04GB
svrm latest e32bf8945cbe 40 hours ago 550MB
docker.osgeo.org/geoserver 2.25.x 7138fc3f0fcc 2 days ago 957MB
Запуск образа
Обычный запуск образа
Для запуска образа нужно ввести в консоли:
$ sudo docker run -it %название-образа%:%тег%
В таблице Docker Images (см. выше) названия образов находятся в колонке REPOSITORY, а теги — в колонке TAG.
Запуск образа с аргументами
В программном коде может быть предусмотрен ввод входных аргументов через аргументы (sys.argv
). В этом случае аргументы нужно ввести после названия и тега образа.
$ sudo docker run -it %название-образа%:%тег% arg_one arg_two ...
Запуск образа с использованием рабочей директории проекта
В проекте может быть предусмотрено сохранение выходных данных в рабочую директорию проекта. Поскольку контейнер представляет собой автономную сущность, которая сама по себе не имеет внешней связи с родительской ОС, рабочую контору нужно примонтировать. Делается это следующим образом:
sudo docker run -it --mount type=bind,src=%/путь/к/внешней/директории%,target=%/путь/к/директории/контейнера% %REPOSITORY%:%TAG% %аргументы%
Запуск образа с графическим интерфейсом на основе PyQt5.
Создание и запуск образа проекта с GUI существенно отличается от работы с обычным проектом без GUI. Во-первых, тут уже понадобится полноценная операционная система на базе Linux в качестве базового образа. В данном случае будет использоваться Linux Ubuntu. Во-вторых, понадобится установка дополнительного программного обеспечения для работы с графическими интерфейсами. В-третьих, это ПО нужно будет активировать при запуске контейнера.
Dockerfile с установкой необходимого ПО можно увидеть в d_py_gui/Dockerfile
. Там, помимо прочего, заводится новый пользователь Linux, в данном случае aminodov
. И проект нужно будет запустить от имени этого же пользователя:
sudo docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -u aminodov imagename:latest