Вопрос или проблема
Я не могу сопоставить мое USB-устройство с контейнером Docker.
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 nov 27 09:28 /dev/ttyUSB0
$ groups
adm dialout sudo audio kvm lpadmin docker
Я сопоставил устройство ttyUSB0 в моем файле docker compose:
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
И вот ошибка, когда я запускаю контейнер:
$ docker compose up
Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB0": no such file or directory
Если я добавляю параметр привилегий в файл compose, я могу запустить контейнер, но получаю эту ошибку, когда используется последовательный порт:
priviliged: true
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
И вот ошибка:
File "/usr/local/lib/python3.10/site-packages/serial/serialposix.py", line 325, in open
raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0'
Если я запускаю docker compose up
с sudo, все работает правильно, поэтому я думаю, что это просто проблема с разрешениями.
Я не могу понять, как правильно сопоставить USB-устройство с контейнером.
У меня была та же проблема. Я использовал Docker Desktop. Я решил ее, удалив Docker Desktop и установив Docker Engine.
Ответ или решение
Как решить проблему с маппингом устройства USB с контейнером Docker на Linux
Вы столкнулись с проблемой маппинга USB устройства с контейнером Docker, что является распространённой задачей для тех, кто интегрирует аппаратные средства с контейнеризированными приложениями. Давайте рассмотрим, как можно решить вашу ситуацию.
Проблема
Судя по вашему описанию, основная проблема заключается в том, что контейнер Docker не может найти устройство /dev/ttyUSB0
, даже несмотря на то, что оно должным образом указано в файле docker-compose. Ошибка, которую вы видите (Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB0": no such file or directory
), обычно возникает из-за проблем с правами доступа или конфигурацией. Кроме того, выполнение команды с sudo
решает проблему, это подтверждает предположение, что дело в правах доступа.
Возможные решения
-
Проверка групп доступа и прав на устройстве:
Убедитесь, что пользователь Docker имеет необходимые права доступа для работы с устройством/dev/ttyUSB0
. Командаls -l /dev/ttyUSB0
показывает, что устройство принадлежит группеdialout
. Хотя вы являетесь частью этой группы, Docker может использовать другие параметры доступа.sudo usermod -aG dialout <username>
После применения команды выше, выполните перезагрузку или выйдите из системы и зайдите снова.
-
Корректировка файла docker-compose:
Проверьте правильность вашего файлаdocker-compose.yml
. Он должен содержать секциюdevices
, как у вас, и важно убедиться, что путь реально совпадает с тем, что отдаетls -l
. -
Запуск Docker без sudo:
Убедитесь, что Docker демон (daemon) работает от имени пользователя с достаточными правами, чтобы взаимодействовать с устройствами. Попробуйте добавить пользователя в группуdocker
, если это еще не было сделано.sudo usermod -aG docker <username>
После этого, снова перезагрузите систему.
-
Использование опции privileged:
Хотя это работает, запуск контейнера с опциейprivileged: true
может быть небезопасным. Это даёт контейнеру доступ ко всей системе, что может быть лишним для вашего случая. -
Использование других подходов:
Если всё ещё получаете ошибки: попробуйте напрямую запускать сdocker run
для тестирования. Это поможет исключить проблемы с конфигурацией вdocker-compose.yml
.docker run --rm -it --device=/dev/ttyUSB0:/dev/ttyUSB0 <image_name>
Заключение
Имея в виду, что запуск контейнера с правами суперпользователя позволяет избежать проблемы, стоит сосредоточиться на правильных правах доступа и группах. Таким образом, вы обеспечите безопасный и корректный маппинг устройств в рамках вашего контейнеризированного приложения.
Если указанная выше информация не решает вашу проблему, рассмотрите возможность обновления Docker или обратитесь к документации для конкретных версий Docker и системных конфигураций.