| # Берём официальный образ Python 3.10 (slim — облегчённый вариант) | |
| # Это ключевой момент: мы фиксируем версию Python, | |
| # чтобы не зависеть от Python 3.13 в Gradio runtime. | |
| FROM python:3.10-slim | |
| # Отключаем создание .pyc файлов (кеш байткода) | |
| # Это уменьшает мусор в контейнере | |
| ENV PYTHONDONTWRITEBYTECODE=1 \ | |
| # Логи выводятся сразу (без буферизации) | |
| # Нужно, чтобы в HF логах ты видел всё в реальном времени | |
| PYTHONUNBUFFERED=1 \ | |
| # Заставляем Gradio слушать все интерфейсы контейнера | |
| # Без этого приложение будет доступно только внутри контейнера | |
| GRADIO_SERVER_NAME=0.0.0.0 \ | |
| # Порт, который ожидает Hugging Face (должен совпадать с app_port в README) | |
| GRADIO_SERVER_PORT=7860 \ | |
| PORT=7860 | |
| # Обновляем список пакетов apt | |
| # Устанавливаем системные библиотеки, которые нужны: | |
| # - gcc / g++ / build-essential — для сборки C-зависимостей | |
| # - libglib2.0-0 / libgl1 — нужны opencv | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| gcc g++ build-essential \ | |
| libglib2.0-0 libgl1 \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Создаём рабочую директорию внутри контейнера | |
| # Все дальнейшие команды будут выполняться в /app | |
| WORKDIR /app | |
| # Копируем только requirements.txt | |
| # Это делается отдельно, чтобы Docker мог кешировать слой | |
| COPY requirements.txt . | |
| # Обновляем pip и устанавливаем зависимости | |
| # --no-cache-dir уменьшает размер образа | |
| RUN pip install --upgrade pip && pip install -r requirements.txt | |
| # Копируем весь проект в контейнер | |
| COPY . . | |
| # Открываем порт 7860 внутри контейнера | |
| # Это декларативная команда — для читаемости | |
| EXPOSE 7860 | |
| # Команда, которая будет выполнена при старте контейнера | |
| # В твоём случае запускаем app.py | |
| CMD ["python", "app.py"] |