Запуск версий Python в Docker: как попробовать последнюю версию Python

Содержание

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

В этом уроке вы узнаете:

  • Какие версии Python доступны
  • Как начать работу с Docker
  • Как запускать разные версии Python в контейнерах Docker
  • Как использовать контейнеры Docker в качестве среды Python

Давайте начнем!

Понимание версий Python и Docker

Долгий путь перехода с Python 2 на Python 3 подходит к концу. Тем не менее, важно, чтобы в дальнейшем вы знали о различных версиях Python и о том, как их опробовать. В целом, существует три различных типа версий, о которых вам следует знать:

  1. Выпущенные версии: Как правило, вы будете использовать что-то вроде Python 3.6, 3.7, или 3.8. Каждая из этих версий добавляет новые функции, поэтому важно помнить, какую версию вы используете. Например, f-строки были введены в Python 3.6 и не будут работать в более старых версиях Python. Аналогично, выражения присваивания стали доступны только в Python 3.8.

  2. Версии для разработки: Сообщество Python постоянно работает над новыми версиями Python. На момент написания этой статьи Python 3.9 находился в стадии разработки. Для предварительного просмотра и тестирования новых функций пользователи имеют доступ к версиям разработки, помеченным как альфа, бета и релиз-кандидат.

  3. Реализации: Python - это язык, который имеет несколько реализаций. Реализация Python содержит интерпретатор и соответствующие библиотеки. CPython является эталонной реализацией Python и наиболее часто используемой. Однако существуют и другие реализации, такие как PyPy, IronPython, Jython, MicroPython и CircuitPython, которые охватывают конкретные варианты использования.

Обычно вы увидите, какую версию Python вы используете, когда запустите REPL. Вы также можете просмотреть 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.

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

Использование Docker

Docker - это платформа для запуска контейнеров с предварительно упакованными приложениями. Это очень мощная система, которая особенно популярна для упаковки и развертывания приложений и микросервисов. В этом разделе вы познакомитесь с основными понятиями, которые вам необходимо знать для использования Docker.

Установка Docker

Docker доступен во всех основных операционных системах: Windows, macOS и Linux. Инструкции по установке Docker в вашей системе приведены в официальном руководстве. Если у вас нет особых потребностей, вы можете использовать версию Docker Engine - Community.

Запущенные контейнеры

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.
[ ... Full output clipped ... ]

В первых строках показано, что Docker загрузил hello-world из Docker Hub. Когда он запускает этот образ, результирующий контейнер выдает "Hello from Docker!" сообщение, которое выводится на ваш терминал.

Создавайте свои собственные изображения с помощью Dockerfiles

Вы можете создавать свои собственные изображения, используя Dockerfiles, который представляет собой обычный текстовый файл, описывающий, как следует настроить изображение Docker. Ниже приведен пример файла Dockerfile:

 1FROM ubuntu
 2RUN apt update && apt install -y cowsay
 3CMD ["/usr/games/cowsay", "Dockerfiles are cool!"]

Файл 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
 _______________________
< Dockerfiles are cool! >
 -----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Опция --rm очистит ваш контейнер после использования. Это хорошая привычка - использовать --rm, чтобы не загружать вашу систему устаревшими контейнерами Docker.

Примечание: В Docker есть несколько команд для управления вашими изображениями и контейнерами. Вы можете перечислить свои изображения и контейнеры, используя docker images и docker ps -a соответственно.

И изображениям, и контейнерам присваивается идентификатор из 12 символов, который вы можете найти в этих списках. Чтобы удалить изображение или контейнер, введите либо docker rmi <image_id>, либо docker rm <container_id> с правильным идентификатором.

Командная строка docker очень мощная. Для получения дополнительной информации используйте docker --help и официальную документацию.

Запуск Python в контейнере Docker

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

Играем с REPL

Когда вы запускаете образ Python из Docker Hub, интерпретатор настраивается таким образом, что вы можете напрямую работать с REPL. Чтобы запустить 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 является сокращением от release candidate и указывает на последнюю версию Python для разработки. В данном случае это последний релиз-кандидат для Python 3.8:

>>> import sys
>>> f"{sys.version_info[:] = }"
"sys.version_info[:] = (3, 8, 0, 'candidate', 1)"

При первом запуске контейнера загрузка может занять некоторое время. Последующие вызовы, по сути, будут выполняться немедленно. Вы можете выйти из REPL как обычно, например, набрав exit(). Это также приведет к выходу из контейнера.

Примечание: Изображения Docker Hub на Python поддерживаются в актуальном состоянии. По мере выхода новых релизов их альфа- и бета-версии становятся доступны по тегу rc.

Однако, если вы хотите протестировать абсолютно новые версии Python, то лучше всего использовать изображение core developers:

$ docker run -it --rm quay.io/python-devs/ci-image:master

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

Для получения дополнительных опций установки вы также можете ознакомиться с полным руководством по установке предварительных версий Python.

Вы можете найти список всех доступных образов Python на Docker Hub. python:latest всегда будет предоставлять вам последнюю стабильную версию Python, в то время как python:rc предоставит вам самую последнюю версию для разработки. Вы также можете запросить конкретные версии, такие как python:3.6.3 или python:3.8.0b4, четвертую бета-версию Python 3.8. Вы даже можете запустить PyPy, используя тег, подобный pypy:latest.

Настройка среды Python

Контейнер Docker - это изолированная среда. Поэтому обычно нет необходимости добавлять виртуальную среду внутрь контейнера. Вместо этого вы можете запустить pip непосредственно для установки необходимых пакетов. Чтобы изменить контейнер и включить в него дополнительные пакеты, вы используете Dockerfile. В следующем примере добавлены parse и realpython-reader в контейнер Python 3.7.5:

 1FROM python:3.7.5-slim
 2RUN python -m pip install \
 3        parse \
 4        realpython-reader

Сохраните этот файл с именем Dockerfile. Тег -slim в строке 1 указывает на файл Dockerfile, основанный на минимальной установке Debian. Этот тег позволяет сделать изображение Docker значительно более компактным, но недостатком является то, что вам, возможно, потребуется самостоятельно установить дополнительные инструменты.

Другие обозначения включают -alpine и -windowsservercore. Вы можете найти более подробную информацию об этих вариантах изображений на странице Docker Hub.

Примечание: Если вы хотите использовать виртуальную среду внутри контейнера Docker, то вам следует знать об одном предостережении. Каждая команда RUN выполняется в отдельном процессе, что означает, что обычная активация виртуальной среды не будет работать внутри файла Dockerfile.

Вместо этого вам следует вручную активировать виртуальную среду, установив VIRTUAL_ENV и PATH переменные среды:

FROM python:3.7.5-slim

# Set up and activate virtual environment
ENV VIRTUAL_ENV "/venv"
RUN python -m venv $VIRTUAL_ENV
ENV PATH "$VIRTUAL_ENV/bin:$PATH"

# Python commands run inside the virtual environment
RUN python -m pip install \
        parse \
        realpython-reader

Дополнительные сведения см. в разделе Элегантная активация virtualenv в файле Dockerfile.

Для создания и запуска файла Dockerfile используйте следующие команды:

$ docker build -t rp .
[ ... Output clipped ... ]

$ 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
[ ... Full output clipped ... ]

Вместо запуска REPL при этом выполняется команда realpython внутри контейнера rp, в котором перечислены последние руководства, опубликованные на Real Python. Для получения дополнительной информации о пакете realpython-reader ознакомьтесь с Как опубликовать пакет Python с открытым исходным кодом в PyPI.

Запуск скриптов на 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:

  1. Смонтируйте локальный каталог как том в контейнере Docker.
  2. Скопируйте скрипт в контейнер 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

Параметр -v /home/realpython/code:/app указывает, что локальный каталог /home/realpython/code должен быть смонтирован как /app внутри контейнера. Затем вы можете запустить скрипт с помощью команды python /app/headlines.py.

Вы захотите скопировать свой скрипт в свой контейнер, если собираетесь развернуть его на другом компьютере. Для этого добавьте несколько шагов в свой 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"]

Вы устанавливаете рабочий каталог внутри вашего контейнера, чтобы управлять тем, где выполняются команды. Затем вы можете скопировать headlines.py в этот рабочий каталог внутри контейнера и изменить команду по умолчанию для запуска headlines.py на python. Перестройте свой образ как обычно и запустите контейнер:

$ docker build -t rp .
[ ... Output clipped ... ]

$ docker run --rm rp
Understanding Python Versions and Docker
Using Docker
Running Python in a Docker Container
Conclusion
Further Reading

Обратите внимание, что ваш скрипт запускается при запуске контейнера, потому что вы указали команду CMD в файле Dockerfile.

Смотрите описание образа Python в на Docker Hub для получения дополнительной информации о создании собственных файлов Docker.

Запуск последней альфа-версии

До сих пор вы загружали изображения из Docker Hub, но доступно множество хранилищ изображений. Например, многие облачные провайдеры, такие как AWS, GCP и DigitalOcean, предлагают специальные реестры контейнеров.

Образ Python для разработчиков core доступен по адресу Quay.io . Чтобы использовать изображения из репозиториев, отличных от стандартных, используйте полное имя. Например, вы можете запустить основной образ для разработчиков следующим образом:

$ docker run -it --rm quay.io/python-devs/ci-image:master

По умолчанию это запускает сеанс оболочки внутри контейнера. Из сеанса оболочки вы можете явно запустить Python:

$ python3.9 -c "import sys; print(sys.version_info)"
sys.version_info(major=3, minor=9, micro=0, releaselevel='alpha', serial=1)

Вы можете просмотреть все доступные версии Python, заглянув внутрь /usr/local/bin:

$ ls /usr/local/bin/
2to3              get-pythons.sh  pydoc3.5           python3.7m
2to3-3.4          idle            pydoc3.6           python3.7m-config
2to3-3.5          idle3.4         pydoc3.7           python3.8
2to3-3.6          idle3.5         pydoc3.8           python3.8-config
2to3-3.7          idle3.6         pydoc3.9           python3.9
2to3-3.8          idle3.7         python2.7          python3.9-config
2to3-3.9          idle3.8         python2.7-config   pyvenv-3.4
codecov           idle3.9         python3.4          pyvenv-3.5
coverage          mypy            python3.4m         pyvenv-3.6
coverage-3.6      mypyc           python3.4m-config  pyvenv-3.7
coverage3         pip3.5          python3.5          smtpd.py
dmypy             pip3.6          python3.5m         stubgen
easy_install-3.5  pip3.7          python3.5m-config  tox
easy_install-3.6  pip3.8          python3.6          tox-quickstart
easy_install-3.7  pip3.9          python3.6m         virtualenv
easy_install-3.8  pydoc           python3.6m-config
easy_install-3.9  pydoc3.4        python3.7

Этот образ особенно полезен, если вы хотите протестировать свой код на нескольких версиях Python. Образ Docker часто обновляется и включает в себя последние версии Python для разработки. Если вам интересно ознакомиться с последними возможностями Python еще до того, как они будут официально выпущены, то это изображение - отличный выбор.

Заключение

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

Теперь вы можете:

  • Запустите Python REPL через Docker
  • Настройте среду Python внутри образа Docker
  • Запуск скриптов внутри контейнеров Docker

Тестируя новые версии Python в Docker, вы оказываете неоценимую помощь сообществу Python. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, оставляйте их в разделе комментариев ниже.

Читать далее

Для получения дополнительной информации о Docker и особенно о рабочих процессах для крупных проектов ознакомьтесь с Создание надежной непрерывной интеграции с Docker и друзьями.

Вы также можете прочитать о других примерах работы с Python и Docker в следующих руководствах:

Back to Top