Перейти к содержимому

Современный Python: Управление зависимостями и Docker. От Pipenv до контейнера.

Современный Python: Управление зависимостями и Docker. От Pipenv до контейнера.

Сегодня мы разберем Pipenv, Poetry и Docker

Цель

  1. Разобраться, зачем нужны менеджеры зависимостей нового поколения (Pipenv, Poetry).
  2. Сравнить Pipenv и Poetry.
  3. Научиться упаковывать Python-приложение в Docker-образ.

Часть 1. Проблема зависимостей и «старая школа»

Ранее стандартом создания виртуального окружения для проекта на python были команда  python -m venv venvи файл requirements.txt.

Это работает, но имеет проблемы:

  • Файл requirements.txt часто не фиксирует версии под-зависимостей (зависимостей ваших зависимостей).
  • Нет разграничения между библиотеками для разработки (тесты, линтеры) и для продакшена.
  • Нужно вручную активировать окружения.

Для решения этих проблем появились более умные инструменты.


Часть 2. Pipenv: Два инструмента в одном

Pipenv — это инструмент, который объединяет pip (установку пакетов) и virtualenv (создание окружений).

Как это работает?

Вместо текстового файла Pipenv использует два файла:

  1. Pipfile: Описание того, что вы хотите установить.
  2. Pipfile.lock: Точное описание того, что было установлено (с хэшами и конкретными версиями). Это гарантирует детерминированную сборку.

Основные команды Pipenv

# Установка (автоматически создает виртуальное окружение)
pip install pipenv

# Создание окружения и установка пакета
pipenv install requests

# Установка dev-зависимости (например, pytest)
pipenv install pytest --dev

# Активация оболочки
pipenv shell

# Запуск скрипта без входа в оболочку
pipenv run python main.py 

Плюсы: Официально рекомендован PyPA некоторое время назад, хорошо работает с Lock-файлами.
Минусы: Может быть медленным при разрешении зависимостей (locking), менее удобен для публикации пакетов.


Часть 3. Poetry: Современный стандарт

Poetry — это более современный инструмент, который решает задачи управления зависимостями, создания виртуальных окружений и сборки/публикации пакетов.

Он использует единый стандарт конфигурации — pyproject.toml (PEP 518).

Основные команды Poetry

# Установка (рекомендуется через скрипт, но можно и pip)
pip install poetry

# Инициализация нового проекта
poetry new my-project
# Или инициализация в существующей папке
poetry init

# Добавление библиотеки
poetry add flask

# Запуск
poetry run python app.py 

Почему Poetry часто выбирают сегодня?

  • Очень быстрый и умный алгоритм разрешения зависимостей (Dependency Resolver).
  • Удобный формат pyproject.toml.
  • Легко публиковать свои библиотеки на PyPI.

Вывод: Для новых проектов рекомендуется использовать Poetry. Именно его мы используем в практической части с Docker.


Часть 4. Практика: Собираем Docker-образ

Docker позволяет упаковать наше приложение вместе со всем окружением (OS, Python, библиотеки) в единый образ. Это гарантирует, что код будет работать везде одинаково.

Шаг 1. Подготовка приложения

Создадим простейшее веб-приложение на Flask, используя Poetry.

  1. Создайте папку и инициализируйте проект:
mkdir python-docker-demo
cd python-docker-demo
poetry init -n  # -n значит "без интерактивных вопросов" 

2. Добавьте Flask:

poetry add flask 

3. Создайте файл app.py:

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Dockerized Python!"

if __name__ == '__main__':
    # Важно: host='0.0.0.0' делает сервер доступным извне контейнера
    app.run(host='0.0.0.0', port=5000)

Шаг 2. Написание Dockerfile

Создайте файл с именем Dockerfile (без расширения) в корне проекта.

Мы используем современный подход: установка Poetry внутри образа и настройка его так, чтобы он не создавал виртуальное окружение (внутри Докера оно не нужно, так как контейнер сам по себе изолирован).

# 1. Берем официальный легкий образ Python
FROM python:3.11-slim

# 2. Устанавливаем переменные окружения
# Отключаем создание .pyc файлов
ENV PYTHONDONTWRITEBYTECODE=1
# Отключаем буферизацию вывода (чтобы логи шли сразу в консоль)
ENV PYTHONUNBUFFERED=1

# 3. Устанавливаем рабочую директорию
WORKDIR /app

# 4. Устанавливаем Poetry
RUN pip install poetry

# 5. Копируем файлы конфигурации зависимостей
COPY pyproject.toml poetry.lock ./

# 6. Настраиваем Poetry:
# virtualenvs.create false -> устанавливать библиотеки в системный python контейнера
RUN poetry config virtualenvs.create false \
    && poetry install --no-interaction --no-ansi --no-root

# 7. Копируем остальной код приложения
COPY . .

# 8. Указываем порт, который будет слушать контейнер
EXPOSE 5000

# 9. Команда запуска
CMD ["python", "app.py"] 

Шаг 3. Сборка (Build)

Теперь превратим наш код и Dockerfile в Образ (Image).

docker build -t my-python-app . 
  • -t my-python-app: даем имя (тег) нашему образу.
  • .: контекст сборки (текущая папка).

Шаг 4. Запуск (Run)

Теперь запустим Контейнер из нашего образа.

docker run -p 5000:5000 my-python-app 
  • -p 5000:5000: пробрасываем порт 5000 из контейнера на порт 5000 вашего компьютера.

Проверка: Откройте браузер и перейдите по адресу http://localhost:5000. Вы должны увидеть надпись: "Hello from Dockerized Python!".


Итоги

  1. pip freeze — это прошлое.
  2. Pipenv и Poetry создают файлы блокировки (.lock), гарантируя, что версии библиотек у всех разработчиков совпадают.
  3. Docker позволяет "заморозить" не только библиотеки Python, но и всю операционную систему, необходимую для запуска кода.
Конспект:
Вторник, 16 декабря 2025
Современный Python: Управление зависимостями и Docker. От Pipenv до контейнера.