README.md

Работа с Python + Docker

ВАЖНО!!!

Для работы с репозиторием рекомендуется использовать OS Linux, а точнее — репозитории на основе Debian, такие как Ubuntu или Astra Linux. Например, для написания данного материала использовалась ОС Astra Linux Common Edition («Орёл»).

Введение

В данном руководстве будут показаны основные примеры работы с Python + Docker. Здесь рассмотрены следующие случаи:

  1. Создание и запуск контейнера для простейшего приложения.
  2. Создание и запуск контейнера для приложения, требующего аргументы командной строки.
  3. Создание и запуск контейнера для приложения, требующего аргументы командной строки и сохраняющего результат работы в файл в файловой системе родительской ОС.
  4. Создание и запуск контейнера для приложения с GUI на базе PyQt5.

Получение необходимых данных

Все данные, необходимые для работы, находятся в репозитории на Gitflic. Для начала работы склонируйте репозиторий на свой локальный носитель:

git clone https://gitflic.ru/project/aminodovborisov/py_and_docker.git

Необходимый инструментарий

Для работы с руководством необходимо иметь следующее программное обеспечение:

  1. Python 3.x (можно скачать последнюю версию с официального сайта).
  2. Установленные дополнительные пакеты языка Python (такие как numpy и другие).
  3. Docker.
  4. Приложение для разработки ПО — любое удобное для пользователя: nano, kate, mceditor, PyCharm etc.
  5. 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
  1. Добавить в 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
Конвейеры
0 успешных
0 с ошибкой