Новые версии Python разрабатывают всё время. Но каждый раз компилировать его самому, чтобы попробовать новую версию, довольно обременительно.
Выход из этой ситуации прост — запускать различные версии Python через Docker.
Из этого руководства вы узнаете:
- Какие версии Python доступны.
- Как начать работу с Docker.
- Как запускать определённую версию Python в контейнерах Docker.
- Как использовать контейнеры Docker в качестве рабочих сред Python.
Docker и версии Python
С прекращением поддержки Python 2.7 в 2020 году, долгий переход от Python 2 к Python 3 вошел в финальную фазу. Однако, двигаясь вперёд, важно знать о различных версиях Python и о том, как их опробовать.
Типы версий Python
- Официальные релизы (Released versions). Обычно, в этом случае речь идёт о чём-то вроде Python 3.6, 3.7 или 3.8. В каждой из этих версий добавлены новые возможности. Поэтому, чтобы правильно оценивать функционал, нужно знать, какая именно версия релиза запущена. К примеру, f-строки (метод форматирования f-strings) ввели в Python 3.6. На более ранних версиях он не работает. Подобным образом, выражения присваивания доступны только начиная с Python 3.8.
- Разрабатываемые версии (Development versions). Сообщество Python постоянно работает над новыми версиями. Пользователям доступны разрабатываемые версии, отмеченные как альфа, бета и релиз-кандидат (release candidate).
- Реализации (Implementations). Python — язык, имеющий несколько вариантов дополнительных реализаций на основе вышедших официальных версий. Каждая из них содержит интерпретатор и соответствующие библиотеки. CPython — эталонная реализация Python, ее используют чаще всего. Тем не менее есть и другие реализации, ориентированные под специфические нужды. Среди них PyPy, IronPython, Jython, MicroPython и CircuitPython.
Версию используемого Python можно увидеть при запуске интерпретатора REPL. Можно также получить дополнительную информацию c помощью команды «sys.implementation».
>>> import sys >>> sys.implementation.name 'cpython' >>> sys.implementation.version sys.version_info(major=3, minor=9, micro=0, releaselevel='alpha', serial=1)
Как видно, код выполнен на первой альфа-версии CPython 3.9.
Традиционно для управления различными версиями Python используются инструменты вроде «pyenv» и «conda». В большинстве случаев их может заменить Docker. И он часто оказывается проще в использовании. Ниже мы практически покажем, как это сделать.
Использование Docker
Docker — мощная платформа для запуска контейнеров с предварительно упакованными приложениями. Она популярна в сфере упаковки и развёртывания приложений и микросервисов. В этом разделе мы сделаем краткий обзор основных шагов, которые нужны, чтобы начать работу с Docker.
Установка Docker
Docker доступен для всех основных ОС: Windows, macOS и Linux. Инструкции по установке Docker на конкретную систему можно найти в их официальных руководствах.
Если специфических требований нет, можно использовать ядро приложения — Docker Engine — в свободно распространяемой «общественной» редакции (Community Edition).
Запуск контейнеров
Работа Docker основана на двух базовых элементах — образах и контейнерах.
- Образ — автономный пакет, который может выполнить Docker.
- Контейнер — выполняемый образ с определённым состоянием (как пользовательский процесс).
Есть несколько репозиториев, содержащих предварительно собранные образы для Docker. Самым распространённым является Docker Hub — публичный репозиторий, который будет использоваться в данном руководстве по умолчанию.
Для примера установим образ «hello-world».
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:451ce787d12369c5df2a32c85e5a03d52cbcef6eb3586dd03075f3... Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. [ ... Результат выполнения команды сокращён ... ]
Первые строки показывают, что Docker скачал образ «hello-world» из репозитория Docker Hub. При запуске этого образа итоговый контейнер выводит на терминал сообщение «Hello from Docker!».
Создание собственных образов с помощью Dockerfile
С помощью Dockerfile можно создавать собственные образы. Это обычный текстовый файл, который описывает, как именно будет устанавливаться образ Docker.
Вот пример Dockerfile:
FROM ubuntu RUN apt update && apt install -y cowsay CMD ["/usr/games/cowsay", "Dockerfile это круто!"]
Файл Dockerfile состоит из перечня команд Docker. В приведённом выше фрагменте три шага:
- Строка 1 создаёт на базе существующего образа под названием «ubuntu» новый. Она выполнима вне зависимости от ОС, на которой запущен Docker.
- Строка 2 устанавливает программу под названием «cowsay».
- Строка 3 задаёт команду, которая сразу запускает «cowsay» при выполнении образа.
Создание Dockerfile начинается с правильного сохранения — под именем «Dockerfile» без какого-либо расширения.
Примечание. Создавать и запускать образы Linux можно на любой платформе. Поэтому такие образы, как «ubuntu», прекрасно подходят для разработки кросс-платформенных приложений. В то же время образ Windows запустится только на Windows, а образ macOS — только на macOS.
Далее создаём при помощи Dockerfile образ:
$ docker build -t cowsay
В результате последует множество сообщений, и будет создан образ. Опция «-t cowsay» задаёт «cowsay» в качестве его имени. Такие теги удобно использовать для отслеживания образов. Финальная точка в команде указывает текущий каталог в качестве контекста сборки для вашего образа. Это должен быть каталог, где находится ваш Dockerfile.
Теперь образ Docker можно выполнить:
$ docker run --rm cowsay _______________________ < Dockerfile это круто! > ----------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Опция «—rm» очистит контейнер после использования. Её применение позволяет не засорять систему уже ненужными контейнерами Docker.
Примечание. Вывести список ваших образов и контейнеров можно, используя команду «docker ps -a».
И образ, и контейнер имеют 12-символьный идентификатор «ID», который можно найти в результатах выполнения этих команд. Чтобы удалить образ или контейнер, можно использовать «docker rmi <ID образа>» либо «docker rm <ID контейнера>», указав их правильный идентификатор.
Возможности команды «docker» очень велики. За расширенной справкой можно обратиться к команде «docker —help» или к официальной документации.
Запуск Python в контейнере Docker
Сообщество Docker выпускает и поддерживает релизы в виде файлов Dockerfile для всех новых версий Python. Опробовать новые функции Python можно, воспользовавшись ими.
Кроме того, ключевые разработчики Python поддерживают образы Docker со всеми доступными на настоящий момент версиями. Далее расскажем, как запустить разные версии Python через Docker.
Запуск REPL
При запуске образов Python из Docker Hub, открывается интерпретатор REPL, в котором будет проходить дальнейшая работа. Чтобы открыть его в контейнере Python, следует выполнить следующую команду:
$ docker run -it --rm python:rc Python 3.8.0rc1 (default, Oct 2 2019, 23:30:03) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
Эта команда скачает образ «python:rc» с сайта Docker Hub, сделает на его основе контейнер и уже в нём выполнит команду «python».
Опции «-it» необходимы для интерактивного запуска контейнера. Тег «rc» означает «релиз-кандидат» и указывает на последнюю разрабатываемую бета-версию Python. В нашем случае это последний релиз-кандидат Python 3.8:
>>> import sys >>> f"{sys.version_info[:] = }" "sys.version_info[:] = (3, 8, 0, 'candidate', 1)"
При первом запуске контейнера Python на его скачивание может потребоваться некоторое время. Но дальнейшие вызовы уже будут происходить практически мгновенно. Выйти из интерпретатора REPL можно, введя «exit()». Одновременно произойдёт выход из контейнера.
Примечание. Образы Python для Docker Hub поддерживаются в достаточно актуальном состоянии. По мере готовности, альфа- и бета-версии становятся доступны под тегом «rc».
Если нужно опробовать самые последние версии Python, то больше подойдёт образ от ключевых разработчиков:
$ docker run -it --rm quay.io/python-devs/ci-image:master
В хранилище Docker Hub можно найти полный список доступных образов Python. Последняя версия Python (стабильная) доступна как «python:latest», а свежая разрабатываемая версия — как «python:rc».
Также можно запросить и точные версии. Например, «python:3.6.3» или «python:3.8.0b4», т.е. четвёртую бету Python 3.8. Можно даже запустить последнюю реализацию PyPy, используя теги вроде «pypy:latest».
Настройка рабочей среды Python в Docker
Контейнер Docker представляет собой изолированное окружение. Таким образом, добавлять внутри контейнера виртуальную среду обычно не требуется. Вместо этого, для установки необходимых модулей Python в Docker можно запустить непосредственно систему управления пакетами pip.
Чтобы модифицировать контейнер включением дополнительных пакетов, используется Dockerfile. В приведенном ниже примере в образ Python 3.7.5 добавляются пакеты «parse» и «realpython-reader».
FROM python:3.7.5-slim RUN python -m pip install \ parse \ realpython-reader
Этот файл нужно сохранить под именем «Dockerfile». Тег «-slim» в первой строке показывает, что Dockerfile исходит из минимальной установки дистрибутива Debian. Этот тег задаёт существенно меньший размер образа Docker. Недостаток в том, что может потребоваться устанавливать дополнительные инструменты самому.
Помимо этого, в число тегов входят такие, как «-alpine» и «-windowsservercore». Подробную информацию о таких вариациях образа можно найти на Docker Hub.
Примечание. Если нужно использовать внутри контейнера Docker виртуальную среду, есть одно важное предостережение. Каждая команда «RUN» выполняется как отдельный процесс.
Типичная активация виртуальной среды в Dockerfile работать не будет. Вместо этого необходимо активировать виртуальную среду вручную, задав переменные среды «VIRTUAL_ENV» и «PATH»:
FROM python:3.7.5-slim # Настроить и активировать виртуальную среду ENV VIRTUAL_ENV "/venv" RUN python -m venv $VIRTUAL_ENV ENV PATH "$VIRTUAL_ENV/bin:$PATH" # Команды Python будут выполнены в виртуальной среде RUN python -m pip install \ parse \ realpython-reader
Чтобы собрать и выполнить свой Dockerfile, необходимо использовать следующие команды:
$ docker build -t rp . [ ... Результат выполнения команды сокращён ... ] $ docker run -it --rm rp
Образу будет задан тег «rp». Затем он будет использоваться для открытия созданного образа из сеанса интерпретатора REPL. Можно убедиться, что в контейнер установлен пакет «parse».
>>> import parse >>> parse.__version__ '1.12.1'
Также можно запускать контейнеры, выполняющие отдельные команды:
$ docker run --rm rp realpython The latest tutorials from Real Python (https://realpython.com/) 0 Run Python Versions in Docker: How to Try the Latest Python Release [ ... Результат выполнения команды сокращён ... ]
Вместо запуска интерпретатора REPL, внутри контейнера «rp» выполняется команда «realpython». Она выводит список последних руководств, опубликованных на специализированном сайте Real Python.
Запуск Python скрипта в Docker
В этом разделе мы расскажем, как запускать скрипты внутри Docker.
Прежде всего, следует сохранить приводимый пример скрипта у себя на компьютере в файл под названием «headlines.py».
# headlines.py import parse from reader import feed tutorial = feed.get_article(0) headlines = [ r.named["header"] for r in parse.findall("\n## {header}\n", tutorial) ] print("\n".join(headlines))
Сначала этот скрипт скачивает последнее руководство с сайта Real Python. Затем он использует пакет «parse», чтобы найти все заголовки и вывести их на терминал.
Есть два основных способа запускать такие скрипты в контейнере Docker:
- Смонтировать локальный каталог в качестве тома (volume) контейнера Docker.
- Скопировать скрипт в нужный контейнер.
Первый вариант особенно удобен при тестировании, поскольку не нужно собирать образ Docker заново при каждом изменении скрипта. Для монтирования каталога в качестве тома, используйте опцию «-v»:
$ docker run --rm -v /home/realpython/code:/app rp python /app/headlines.py Understanding Python Versions and Docker Using Docker Running Python in a Docker Container Conclusion Further Reading
Если же скрипт будет использован на другом компьютере, нужно скопировать его внутрь контейнера. Это можно сделать, добавив в Dockerfile пару шагов:
FROM python:3.7.5-slim WORKDIR /usr/src/app RUN python -m pip install \ parse \ realpython-reader COPY headlines.py . CMD ["python", "headlines.py"]
Опцией «WORKDIR» внутри контейнера задается рабочий каталог, в котором будут выполняться команды. Можно скопировать файл «headlines.py» в этот каталог внутри контейнера, после чего изменить команду по умолчанию на выполнение «headlines.py» с помощью «python».
Соберите образ, как обычно. Остается лишь запустить контейнер:
$ docker build -t rp . [ ... Результат выполнения команды сокращён ... ] $ docker run --rm rp Understanding Python Versions and Docker Using Docker Running Python in a Docker Container Conclusion Further Reading
Обратите внимание, поскольку в Dockerfile была указана команда «CMD», при запуске контейнера сразу выполняется нужный скрипт.
Подробности о том, как создавать собственные файлы Dockerfile — в описании образа Python на сайте Docker Hub.
Заключение
Это руководство — краткое введение в работу с различными версиями Python при использовании Docker. Оно поможет быстро протестировать код и убедиться, что он совместим с последними версиями Python.
Изучив эту инструкцию, вы сможете:
- Запускать интерпретатор Python REPL при помощи Docker.
- Настраивать среду Python внутри образа Docker.
- Запускать внутри контейнеров Docker скрипты.
Поместить скрипт Python в Docker контейнер — дело пары минут. Теперь опробовать последнюю альфа-версию языка можно сразу после публикации.
Нужна надёжная база для разработки программных продуктов? Выбирайте виртуальные сервера от Eternalhost с технической поддержкой 24/7 и бесплатной защитой от DDoS!
Автор оригинала: Geir Arne Hjelle