- Вопрос или проблема
- Ответ или решение
- Шаг 1: Проверка наличия устройства /dev/dri
- Шаг 2: Добавление пользователя в группу render
- Шаг 3: Обновление вашего файла docker-compose.yml
- Шаг 4: Запуск контейнера с дополнительными правами (без privileges)
- Шаг 5: Создание устройства внутри контейнера (при необходимости)
- Пояснение вывода команды ls
- Заключение
Вопрос или проблема
У меня проблема с правами доступа. Я запускаю 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: Создание устройства внутри контейнера (при необходимости)
Если устройства отсутствуют внутри контейнера, вы можете создать их следующим образом:
-
Запустите контейнер в интерактивном режиме:
docker run -it --device=/dev/dri photoprism/photoprism:latest /bin/bash
-
Создайте директорию
/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
-
Закройте контейнер и запустите его снова с помощью
docker-compose
.
Пояснение вывода команды ls
Что касается вашего вопроса о числе 226
в выводе команды ls
, это обозначение номер устройства (major number) в UNIX-подобных системах. В вашем случае:
226
— это номер устройства (major) для графического устройства.- Второе число указывает на номер вашего конкретного устройства (minor).
Эти номера помогают системе идентифицировать и управлять устройствами.
Также проверьте, что ваш пользователь, который запускает Docker контейнеры, имеет разрешение на доступ к устройствам в /dev/dri
, если вы используете новую версию Docker и изменения в политике безопасности.
Заключение
Эти шаги должны помочь вам настроить правильный доступ к /dev/dri
для вашего контейнера Photoprism, не используя режим привилегий. Если проблема остаётся неразрешенной, следует убедиться в корректной установке драйверов и наличии поддержки аппаратного ускорения в вашей системе.