FFmpeg в Docker для Python-бота на Bothost

Библиотека из PyPI и бинарник ffmpeg в системе — это разные вещи. Ниже — как это работает в контейнерах, какие ошибки чаще всего встречаются и что именно делает хостинг Bothost при сборке образа (логика agentv3 на ноде сборки).

Почему одного pip install недостаточно

Пакет ffmpeg-python — это обёртка над командной строкой: он строит аргументы и запускает исполняемый файл ffmpeg (и при необходимости ffprobe). Сам бинарник в контейнер pip не кладёт. В образ нужно установить ffmpeg через пакетный менеджер ОС (в Debian/Ubuntu — apt), а уже потом ставить Python-зависимости из pip. На Bothost ваш бот собирается в Docker-образ и запускается в контейнере. Базовый слой для Python-проектов — образы семейства python:{версия}-slim (Debian). В «голом» slim ffmpeg нет, пока его явно не добавить.

Как Bothost собирает образ (кратко)

При создании или обновлении бота нода agentv3:
  • Клонирует репозиторий (или разворачивает архив).
  • Генерирует Dockerfile функцией generate_dockerfile в main.py — с учётом шаблона, requirements.txt / pyproject.toml, версии Python и т.д.
  • Сохраняет Dockerfile в каталог сборки и выполняет docker build.
Итог: рабочий сценарий для Python-бота — не «придумать Dockerfile руками и забыть», а положить правильные зависимости в репозиторий, чтобы сгенерированный Dockerfile подтянул нужные системные пакеты.

Что мы добавили на стороне Bothost

В генератор Python-Dockerfile добавлена проверка зависимостей (текст requirements.txt и при использовании uv — соответствующий фрагмент pyproject.toml). Если в зависимостях встречаются, например:
  • ffmpeg-python
  • pydub
  • aeneas
  • moviepy
…в Dockerfile автоматически попадает установка пакета ffmpeg через apt-get (в поставке Debian он же подтягивает ffprobe, что важно для типичных ошибок из практики). После деплоя пересоберите бота (push в Git или повторное развёртывание), чтобы слой с apt попал в образ.

Пример Dockerfile при дефолтной сборке Bothost

Платформа сама генерирует Dockerfile (и перед docker build записывает его в каталог проекта). В репозитории вы по-прежнему храните только код и requirements.txt; руками Dockerfile писать не обязательно. Ниже — упрощённый пример того, что получится для типичного Python-бота с ffmpeg-python в зависимостях (версия Python, имя точки входа и блок установки пакетов в реальности могут отличаться — в логе сборки всегда виден полный сгенерированный файл):
FROM python:3.11-slim

WORKDIR /app

# Системные пакеты: ffmpeg (появляется, если в deps есть ffmpeg-python, pydub, aeneas, moviepy)
RUN apt-get update && apt-get install -y \
    ffmpeg \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
# … установка зависимостей из requirements.txt (на Bothost это может быть построчный pip и доп. шаги для aiogram и т.д.)
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "bot.py"]
Имя файла запуска (bot.py) и версия образа (3.11, 3.12 …) подставляются из настроек бота и содержимого репозитория.

Типичная ошибка: «не найден ffprobe»

На Stack Overflow часто приводят ситуацию: ffmpeg как будто установили, а Python-библиотека ругается на ffprobe (No such file or directory). На Debian/Ubuntu метапакет ffmpeg обычно ставит и ffmpeg, и ffprobe в стандартные пути (/usr/bin/...). Если ставить только «урезанные» или кастомные сборки — проверяйте, что оба бинарника на PATH.

Путаница с именами пакетов в Python

Если видите что-то вроде AttributeError: module 'ffmpeg' has no attribute 'input' — часто установлен не тот пакет. Для API в стиле ffmpeg.input(...) нужен пакет ffmpeg-python, а не другие одноимённые пакеты с PyPI.

Два подхода к Docker «вообще» (и зачем боту свой образ)

В гайде на DEV разбирают, в частности:
  • готовый образ вроде jrottenberg/ffmpeg — удобно для разовой конвертации файлов с примонтированной папкой;
  • свой Dockerfile на базе Ubuntu/Debian с apt-get install -y ffmpeg — когда нужен полноценный рантайм (например, Python + зависимости + ваш код).
На Bothost для постоянно работающего бота как раз второй сценарий: один образ с интерпретатором, зависимостями и системным ffmpeg.

Минимальный чек-лист

  • В requirements.txt (или в зависимостях pyproject.toml) указать ffmpeg-python (или другую библиотеку из списка выше — тогда подтянется apt-пакет ffmpeg).
  • Убедиться, что в коде вызывается установленный CLI (при странных PATH некоторые библиотеки позволяют явно задать путь к бинарникам — смотрите документацию вашей обёртки).
  • Задеплоить бота заново и при необходимости посмотреть лог сборки в панели Bothost: там виден итоговый Dockerfile и вывод docker build.

Полезные ссылки


Статья подготовлена для блога Bothost с учётом текущей логики сборки agentv3.

133 просмотров
0 лайков
0 комментариев