Доступ к USB-устройству из Docker

В нашем CI мы используем Jenkins. В jenkinfile я запускаю образ докера, который создает двоичные файлы для прошивки на нуклео-плате stm32. Чтобы быть более точным, процесс прошивки выполняется как процесс пост-сборки в файле CMakeLists.txt в образе докера. Я знаю, что плата stm32 доступна в образе докера, поскольку я тестировал ее с помощью lsusb. Но ошибка openOCD:

Ошибка: ошибка libusb_open () с LIBUSB_ERROR_NO_DEVICE

Я также попытался вызвать ту же команду openOCD из Jenkinfile (то есть за пределами изображения докера), и там она выдает мне ошибку:

libusb_open () не удалось с LIBUSB_ERROR_ACCESS

Если я использую команду в терминале, она работает. Я думаю, это как-то связано с udev и правилами доступа. Но я понятия не имею, как они используются или создаются.

Вопросов:

  • Почему openOCD не обнаруживает устройство в образе докера, даже если оно указано при вызове lsusb?
  • Почему openOCD не может получить доступ к устройству при вызове из файла Jenkins, даже если на том же компьютере работает та же команда в терминале?
  • Если проблема второго вопроса заключается в отсутствии правил udev для openocd, как я могу сгенерировать их по сценарию, чтобы они работали в докере?

Заранее большое спасибо за вашу помощь.


person martin    schedule 21.11.2020    source источник


Ответы (1)


Вот как я запускаю OpenOCD в докере для программирования ПЛИС Xilinx:

docker run --rm -it \
  --device-cgroup-rule='c 189:* rmw' \
  -v /dev:/dev \
  docker.lan:5000/openocd \
  openocd -f /opt/openocd/arty_a7.cf

Параметр --device-cgroup-rule настраивает доступ к контрольной группе для символьных устройств со старшим номером 189, который можно найти в узле устройства устройства, к которому вы пытаетесь получить доступ в /dev.

Кроме того, -v /dev:/dev предоставляет доступ к дереву устройств внутри контейнера. Вероятно, это должно быть просто конкретное устройство, которое вы хотите использовать, для чего правила udev потребовали бы присвоить ему постоянное имя.

person Matt Thompson    schedule 13.12.2020