Проблема с правами Docker при доступе к устройству /dev/dri

Вопрос или проблема

У меня проблема с правами доступа. Я запускаю Photoprism внутри контейнера Docker на Ubuntu 22.04. Я хочу использовать аппаратное транскодирование Intel QuickSync. Для этого приложению нужно получить доступ к устройству /dev/dri. Я пытаюсь запустить приложение без использования priviledged: true в файле docker-compose. Это работает (т.е. приложение может использовать /dev/dri), когда используется priviledged: true. Однако когда я убираю priviledged: true, приложение сообщает об этом, хотя devices:\n - /dev/dri находится в файле docker-compose.yml:

$ docker-compose up -d
...
 ⠿ Container photoprism-photoprism-1  Starting                                                                                                                              1.9s 
Ошибка ответа от демона: ошибка сбора информации об устройстве при добавлении пользовательского устройства "/dev/dri": нет такого файла или каталога

В настоящее время я установил Plex нативно (т.е. не используя Docker), и он хорошо работает с /dev/dri.

Вот права на /dev/dri:

$ ls -al /dev/dri
total 0
drwxr-xr-x   3 root root        100 May 29 14:09 .
drwxr-xr-x  19 root root       5200 May 29 14:09 ..
drwxr-xr-x   2 root root         80 May 29 14:09 by-path
crw-rw----+  1 root render 226,   0 May 29 14:09 card0
crw-rw----+  1 root render 226, 128 May 29 14:09 renderD128

(render — это название группы, но какое значение имеет 226, в выводе списка?)

Вот детали пользователя plex (это пользователь, который запускает plexmediaserver, который работает с /dev/dri):

$ id plex
uid=998(plex) gid=998(plex) groups=998(plex),44(video),109(render)

…и пользователь, который запускает docker-compose up -d

$ id myuser
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare)

Я думал, что раз пользователь plex прекрасно работает с /dev/dri, то, возможно, я смогу использовать пользователя plex с Photoprism. Но у меня не получилось:

   # внутри docker compose
   user: "998:998"

Вот соответствующие части файла docker-compose.yml:

services:
  photoprism:
    image: photoprism/photoprism:latest
    ...
    ## Запустить как пользователь без прав root перед инициализацией (поддерживается: 0, 33, 50-99, 500-600 и 900-1200):
    user: "998:998"
    ## Поделиться аппаратными устройствами с FFmpeg и TensorFlow (по желанию):
    devices:
      - "/dev/dri:/dev/dri"                         # Intel QSV
    ...

Кратко:
Работает, когда я использую привилегированный режим docker, не работает в противном случае. Также мне нужна помощь в понимании вывода ls, который таинственным образом включает неопределенное 226, (см. выше вывод ls).

Я столкнулся с подобной проблемой с моим QNAP TS-251b и photoprism. Следующая команда docker сработала для меня:

sudo docker run -d --device=/dev/dri photoprism

Я также связался с поддержкой QNAP по поводу проблемы с сопоставлением устройств, и они предоставили мне следующие шаги для сопоставления (создания) устройства dri (которые нужно выполнять в контейнере):

mkdir /dev/dri
mknod /dev/dri/card0 c 226 0
mknod /dev/dri/renderD128 c 226 128
chmod 666 /dev/dri/card0
chmod 666 /dev/dri/renderD128

Надеюсь, это поможет.

Спасибо! Ваше решение по созданию устройства dri в моей Виртуальной Машине сработало для меня. Я получал “Ошибка ответа от демона: ошибка сбора информации об устройстве при добавлении пользовательского устройства “/dev/dri”: нет такого файла или каталога”, всякий раз, когда пытался поднять свой контейнер Immich через docker compose.

Версия ОС Ubuntu:

  • VERSION_ID=”24.04
  • VERSION=”24.04.1 LTS (Noble Numbat)
  • VERSION_CODENAME=noble

Надеюсь, кто-то другой найдет это полезным в будущем. Спасибо еще раз!

Ответ или решение

Проблема с доступом к устройству /dev/dri в контейнере Docker может быть вызвана недостаточными разрешениями, когда вы не используете privileged: true. Чтобы решить эту проблему, следуйте приведённым ниже шагам.

Шаг 1: Проверка наличия устройства /dev/dri

Первое, что нужно сделать, это убедиться, что устройство /dev/dri доступно на хосте. Вы можете выполнить следующую команду:

ls -al /dev/dri

Если вы видите, что устройства card0 и renderD128 присутствуют, то можно переходить к следующему шагу.

Шаг 2: Добавление пользователя в группу render

Убедитесь, что пользователь, под которым запускается контейнер, состоит в группе render. Это можно сделать с помощью следующей команды:

sudo usermod -aG render myuser

Замените myuser на имя вашего пользователя. После выполнения этой команды вам нужно выйти из системы и войти снова, чтобы изменения вступили в силу.

Шаг 3: Обновление вашего файла docker-compose.yml

Убедитесь, что ваши настройки в docker-compose.yml правильно определены. Вот пример правильной конфигурации для вашего контейнера Photoprism:

services:
  photoprism:
    image: photoprism/photoprism:latest
    user: "998:998"  # Идентификатор пользователя Plex
    devices:
      - "/dev/dri:/dev/dri"  # Открываем доступ к устройству

Шаг 4: Запуск контейнера с дополнительными правами (без privileges)

Попробуйте запустить контейнер без использования privileged: true, но с указанием устройства:

docker-compose up -d

Если вы продолжаете получать ошибку: error gathering device information while adding custom device "/dev/dri": no such file or directory, попробуйте следующие команды, чтобы создать устройства внутри вашего контейнера.

Шаг 5: Создание устройства внутри контейнера (при необходимости)

Если устройства отсутствуют внутри контейнера, вы можете создать их следующим образом:

  1. Запустите контейнер в интерактивном режиме:

    docker run -it --device=/dev/dri photoprism/photoprism:latest /bin/bash
  2. Создайте директорию /dev/dri и необходимые устройства:

    mkdir /dev/dri
    mknod /dev/dri/card0 c 226 0
    mknod /dev/dri/renderD128 c 226 128
    chmod 666 /dev/dri/card0
    chmod 666 /dev/dri/renderD128
  3. Закройте контейнер и запустите его снова с помощью docker-compose.

Пояснение вывода команды ls

Что касается вашего вопроса о числе 226 в выводе команды ls, это обозначение номер устройства (major number) в UNIX-подобных системах. В вашем случае:

  • 226 — это номер устройства (major) для графического устройства.
  • Второе число указывает на номер вашего конкретного устройства (minor).

Эти номера помогают системе идентифицировать и управлять устройствами.

Также проверьте, что ваш пользователь, который запускает Docker контейнеры, имеет разрешение на доступ к устройствам в /dev/dri, если вы используете новую версию Docker и изменения в политике безопасности.

Заключение

Эти шаги должны помочь вам настроить правильный доступ к /dev/dri для вашего контейнера Photoprism, не используя режим привилегий. Если проблема остаётся неразрешенной, следует убедиться в корректной установке драйверов и наличии поддержки аппаратного ускорения в вашей системе.

Оцените материал
Добавить комментарий

Капча загружается...