Текст и данные · Инструкция
Docker --device: передать устройство в контейнер
Флаг полезен для последовательных портов, USB-адаптеров и других Linux-устройств, когда контейнеру действительно нужен прямой доступ к device node.
Короткий ответ
Для одиночного устройства используйте --device=/dev/…:/dev/… вместо --privileged: контейнер получит только явно переданный device node и заданные права.
Что важно понять до начала
`--device` добавляет устройство хоста в контейнер без полного набора привилегий `--privileged`. Формат допускает отдельные пути на хосте и в контейнере, а также режим доступа `r`, `w`, `m`. Путь `/dev/..` должен существовать на хосте в момент запуска контейнера. Доступ может дополнительно зависеть от UID/GID и групп внутри контейнера.
Совет: Практический ориентир: `--device` передаёт конкретное устройство и оставляет остальные ограничения. `--privileged` существенно расширяет права контейнера целиком.
Пошаговый порядок действий
- 1. Найдите нужный путь устройства на хосте через `ls -l /dev/..` и зафиксируйте его владельца и группу.
- 2. Запустите тестовый контейнер с `--device=/dev/ttyUSB0:/dev/ttyUSB0`, не добавляя `--privileged`.
- 3. Внутри контейнера проверьте наличие node командой `ls -l /dev/ttyUSB0`.
- 4. Если приложение получает Permission denied, сопоставьте пользователя/группу или добавьте только необходимую group.
- 5. Перезапустите приложение и проверьте реальную операцию чтения/записи, а не только наличие файла.
Важно: Критично для этой задачи: Не подменяйте диагностику флагом `--privileged`: он значительно расширяет доступ контейнера и скрывает проблему с конкретными разрешениями.
Ошибки и пограничные случаи
Не подменяйте диагностику флагом `--privileged`: он значительно расширяет доступ контейнера и скрывает проблему с конкретными разрешениями. Устройства с динамическими именами после переподключения USB могут получить другой `/dev`-путь; для стабильной конфигурации удобнее использовать постоянные symlink из `/dev/serial/by-id` там, где они есть.
Предупреждение: Пограничный случай: Обычно причина в правах Unix: UID/GID, группе устройства или дополнительном security-профиле. Сначала сверяйте владельца device node на хосте и пользователя процесса в контейнере.
Проверка перед завершением
- Найдите нужный путь устройства на хосте через `ls -l /dev/..` и зафиксируйте его владельца и группу.
- Внутри контейнера проверьте наличие node командой `ls -l /dev/ttyUSB0`.
- Перезапустите приложение и проверьте реальную операцию чтения/записи, а не только наличие файла.
- Проверено отдельно: `--device` передаёт конкретное устройство и оставляет остальные ограничения. `--privileged` существенно расширяет права контейнера целиком.
Практический сценарий и контроль результата
Для постоянного оборудования отдельно продумайте стабильное имя устройства. USB‑адаптер после переподключения может получить другой ttyUSB‑номер, поэтому конфигурацию лучше привязывать к устойчивому пути, если система его предоставляет. После запуска проверяйте не только наличие файла в /dev, но и реальную операцию приложения: чтение порта, доступ к камере или другому устройству. Если node виден, а операция запрещена, следующий шаг — права пользователя и группы, а не переход к --privileged.
Дополнительные нюансы и проверка
Если устройство нужно только одному процессу, начинайте с минимального доступа и не расширяйте права заранее. Для последовательного порта отдельно проверьте группу device node и пользователя приложения внутри контейнера. Если путь меняется после переподключения USB, используйте устойчивое имя устройства, а не случайный ttyUSB‑номер. Такой тест сразу отделяет три разные причины: устройство не передано, устройство передано без нужных прав или само приложение не умеет работать с ним.
Что учитывать
`--device` добавляет устройство хоста в контейнер без полного набора привилегий `--privileged`. Формат допускает отдельные пути на хосте и в контейнере, а также режим доступа `r`, `w`, `m`. Путь `/dev/..` должен существовать на хосте в момент запуска контейнера. Доступ может дополнительно зависеть от UID/GID и групп внутри контейнера.
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. docker container run). Пример и формулировки — редакция N1RO на 2026-09-22.