Это не протестированный образ
Вот готовый Dockerfile. Поскольку официальная поддержка CUDA в пакетах opencv-python и ffmpeg через pip/dnf отсутствует, библиотеки собираются из исходников с флагами аппаратного ускорения NVIDIA.
FROM registry.red-soft.ru/ubi8/python-311:latest
# Переключаемся на root для установки системных пакетов
USER root
# Устанавливаем dnf-plugins-core для управления репозиториями
RUN dnf install -y dnf-plugins-core
# Включаем репозиторий Codeready Builder (содержит dev-пакеты в UBI)
RUN dnf config-manager --set-enabled ubi-8-codeready-builder
# Установка зависимостей сборки, инструментов и запрошенных системных библиотек
# Примечание: названия пакетов адаптированы под RHEL 8 / UBI 8:
# libusb-1.0-0 -> libusb1
# libglib2.0-0 -> glib2
# libgl1-mesa-glx -> mesa-libGL
# libgomp1 -> libgomp
RUN dnf install -y \
gcc gcc-c++ make cmake git pkgconfig \
python3.11-devel \
libusb1 glib2 mesa-libGL libgomp net-tools \
nasm yasm wget curl \
&& dnf clean all
# Добавляем официальный репозиторий NVIDIA CUDA и устанавливаем CUDA Toolkit (12.4)
RUN dnf install -y https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8-repo-latest-1.x86_64.rpm \
&& dnf install -y cuda-toolkit-12-4 \
&& dnf clean all
ENV PATH=/usr/local/cuda/bin:$PATH
ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
# Установка Python-библиотеки harvesters
RUN pip install --no-cache-dir harvesters
# ==========================================================
# Сборка FFmpeg с поддержкой NVIDIA (cuvid, nvenc, nvdec)
# ==========================================================
RUN git clone --depth 1 --branch n7.0 https://github.com/FFmpeg/FFmpeg.git /tmp/ffmpeg \
&& cd /tmp/ffmpeg \
&& ./configure \
--prefix=/usr/local \
--enable-cuda-nvcc \
--enable-cuvid \
--enable-nvenc \
--enable-nvdec \
--enable-gpl \
--enable-nonfree \
--enable-shared \
--extra-cflags="-I/usr/local/cuda/include" \
--extra-ldflags="-L/usr/local/cuda/lib64" \
&& make -j$(nproc) \
&& make install \
&& ldconfig \
&& rm -rf /tmp/ffmpeg
# ==========================================================
# Сборка OpenCV с поддержкой CUDA
# ==========================================================
RUN git clone --depth 1 --branch 4.9.0 https://github.com/opencv/opencv.git /tmp/opencv \
&& git clone --depth 1 --branch 4.9.0 https://github.com/opencv/opencv_contrib.git /tmp/opencv_contrib \
&& mkdir -p /tmp/opencv/build && cd /tmp/opencv/build \
&& cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D PYTHON3_EXECUTABLE=/usr/bin/python3.11 \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN=5.2,6.0,6.1,7.0,7.5,8.0,8.6,8.9,9.0 \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D OPENCV_DNN_CUDA=ON \
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv_contrib/modules \
-D BUILD_opencv_python3=ON \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
.. \
&& make -j$(nproc) \
&& make install \
&& ldconfig \
&& rm -rf /tmp/opencv /tmp/opencv_contrib
# Очистка инструментов сборки для уменьшения размера образа
RUN dnf remove -y gcc gcc-c++ make cmake nasm yasm wget curl git \
&& dnf clean all \
&& pip cache purge
ENV PYTHONUNBUFFERED=1
# Возврат к стандартному non-root пользователю UBI
USER 1001
WORKDIR /app
CMD ["python3.11", "-c", "import cv2; print(f'OpenCV: {cv2.__version__}'); print('CUDA devices:', cv2.cuda.getCudaEnabledDeviceCount())"]
🔧 Как собрать и запустить
1. Сборка образа
docker build -t ubi8-python-cv-nvidia .
2. Запуск с доступом к GPU
Контейнер необходимо запускать с пробросом NVIDIA GPU, иначе cv2.cuda и ffmpeg не увидят видеокарту:
docker run --gpus all --rm ubi8-python-cv-nvidia
(Если используется старая версия Docker, вместо --gpus all потребуется --device /dev/nvidia0 --device /dev/nvidiactl --device /dev/nvidia-uvm)
📌 Важные примечания
- Время сборки и размер образа: Компиляция OpenCV и FFmpeg из исходников занимает 10–30 минут (зависит от CPU) и значительно увеличивает размер образа. Для продакшена рекомендуется вынести этапы компиляции в отдельный stage или использовать кэширование Docker BuildKit.
- Архитектура GPU: В
CUDA_ARCH_BINуказаны коды архитектур от GTX 900 до RTX 40 серии. Если у вас конкретная карта (например, только RTX 3090), ускорьте сборку, оставив только8.6. - Harvesters: Пакет
harvestersустановлен черезpip. Для работы с реальными промышленными камерами (GenICam/USB3Vision) вам потребуется скопировать в контейнер.ctiфайлы от производителя камеры и установить их в переменную окруженияGENICAM_GENTL64_PATH. - cuDNN: OpenCV собрана с
OPENCV_DNN_CUDA=ON. Если нужен полный бэкенд cuDNN для нейросетей, его необходимо скачать вручную с сайта NVIDIA Developer и добавить в образ перед сборкой OpenCV (требуется учетная запись).
Установка harvesters из исходного кода выполняется стандартным для современных Python-пакетов способом. Библиотека написана на чистом Python (использует ctypes для взаимодействия с GenTL), поэтому компиляция C/C++ не требуется.
📦 Требования
- Python 3.7 или выше
gitpip(желательно актуальной версии)- Рекомендуется использовать виртуальное окружение
🛠 Пошаговая инструкция
1. Клонирование репозитория
git clone https://github.com/genicam/harvesters.git
cd harvesters
2. Создание и активация виртуального окружения
Linux / macOS:
python -m venv venv
source venv/bin/activate
Windows (CMD):
python -m venv venv
venv\Scripts\activate.bat
Windows (PowerShell):
python -m venv venv
venv\Scripts\Activate.ps1
3. Обновление инструментов сборки
pip install --upgrade pip setuptools wheel build
4. Установка из исходников
pip install .
💡 Эта команда автоматически разрешит все зависимости (
numpy,genicam-обёртки и др.), указанные вpyproject.toml.
🧑💻 Режим разработки (editable install)
Если вы планируете вносить правки в код или запускать тесты, установите пакет в режиме разработки:
pip install -e .[dev]
Если группа dev не определена в вашем коммите, используйте просто pip install -e .
Теперь изменения в исходниках будут сразу доступны без повторной установки.
✅ Проверка установки
python -c "import harvesters; print(harvesters.__version__)"
Команда должна вывести номер версии без ошибок.
⚠️ Важные нюансы
-
GenTL Producer (
.ctiфайлы)
harvesters— это только клиентская библиотека. Для работы с камерами вам потребуется GenTL Producer от производителя оборудования (Basler, FLIR, Stemmer, OpenCV GenICam и т.д.). Путь к.ctiфайлу указывается при инициализации:from harvesters.core import Harvester h = Harvester() h.add_file('/path/to/your/producer.cti') h.update() -
Зависимости от ОС
На некоторых Linux-дистрибутивах может потребоваться установить системные пакеты дляnumpyилиctypes(обычноpython3-dev,libffi-dev), но в 95% случаевpipсправляется самостоятельно. -
Официальная документация
- GitHub: https://github.com/genicam/harvesters
- Docs: https://genicam.github.io/harvesters/
- Примеры использования: папка
samples/в репозитории
Если при установке возникнут ошибки (например, конфликт версий numpy или проблемы с разрешениями), пришлите вывод консоли — помогу разобраться.