Современный Python: Управление зависимостями и Docker. От Pipenv до контейнера.
Сегодня мы разберем Pipenv, Poetry и Docker.
Цель
- Разобраться, зачем нужны менеджеры зависимостей нового поколения (Pipenv, Poetry).
- Сравнить Pipenv и Poetry.
- Научиться упаковывать Python-приложение в Docker-образ.
Часть 1. Проблема зависимостей и «старая школа»
Ранее стандартом создания виртуального окружения для проекта на python были команда python -m venv venvи файл requirements.txt.
Это работает, но имеет проблемы:
- Файл requirements.txt часто не фиксирует версии под-зависимостей (зависимостей ваших зависимостей).
- Нет разграничения между библиотеками для разработки (тесты, линтеры) и для продакшена.
- Нужно вручную активировать окружения.
Для решения этих проблем появились более умные инструменты.
Часть 2. Pipenv: Два инструмента в одном
Pipenv — это инструмент, который объединяет pip (установку пакетов) и virtualenv (создание окружений).
Как это работает?
Вместо текстового файла Pipenv использует два файла:
- Pipfile: Описание того, что вы хотите установить.
- 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.
- Создайте папку и инициализируйте проект:
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!".
Итоги
pip freeze— это прошлое.- Pipenv и Poetry создают файлы блокировки (
.lock), гарантируя, что версии библиотек у всех разработчиков совпадают. - Docker позволяет "заморозить" не только библиотеки Python, но и всю операционную систему, необходимую для запуска кода.
