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 с ошибкой