Можно ли использовать npm serialPort из контейнера Docker? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть проект узла, работающий в контейнере Docker из Ubuntu, и хост-машина также Ubuntu.

В моем проекте узла (написано в машинописном тексте) я пытаюсь использовать последовательный порт npmlibrary.

https://www.npmjs.com/package/serialport

У меня есть строки:

include * as serialport from 'serialport'

// further down

serialport.list((err, list) => {

    // after checking for errors
    console.log(list);

});

Теперь, если я просто запускаю этот код на хост-машине, я получаю список результатов смного информации. Например, для одного устройства:

{ manufacturer: 'Prolific Technology Inc.',
serialNumber: undefined,
pnpId: 'usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0',
locationId: undefined,
vendorId: '067b',
productId: '2303',
comName: '/dev/ttyUSB0' }

Но когда я запускаю тот же код в док-контейнере, я получаю следующее:

{ manufacturer: undefined,
 serialNumber: undefined,
 pnpId: undefined,
 locationId: undefined,
 vendorId: undefined,
 productId: undefined,
 comName: '/dev/ttyUSB0' }

Как вы можете видеть, большинство изинформация возвращается как неопределенная.

Это делается, давая привилегированному статусу Docker-контейнера и доступ к тому / dev. Например, в docker-compose

myapp:
 image: myappimage
 ports: 8999:8999
 volumes:
   - /dev:/dev
   - ./:/myappdir
 privileged: true
 command: ./scripts/runApp.sh

Или работает

docker run --privileged -v /dev:/dev -v /path/to/my/app:/app node:4.4.0 ./scripts/runApp.sh

Приложение запускается и определяет, какие последовательные порты доступны в / dev, но информация об устройстве не извлекается.

Эта ссылка:

Контейнер Docker не видит устройство с последовательным портом

Предполагает, что это может быть даже невозможно сделать, по крайней мерене для Mac. Это возможно на Linux-машине?

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 05 октября 2019

На всякий случай, если у кого-то еще возникнет такая же проблема, я опубликую найденное мной решение:

Копаясь в привязках linux для узла serialport, я увидел, что udevadm info -e используется дляполучить все устройства. Выполнение этой команды в контейнере дало меньше информации, чем на хосте, но это то, что дало мне информацию googleable, необходимую для поиска этой страницы:

udevadm не показывает все атрибуты внутри контейнера докера

Эта страница дала мне два решения! Во-первых, использовать /run/udev:/run/udev:ro в разделе томов для последовательного порта, чтобы работать, а затем использовать network_mode:'host' для обнаружения изменений при подключении устройств (для этого я использую узел usb-Detection ).

Итак, в моем файле docker-compose у меня теперь есть:

myapp:
  image: myappimage
  ports: 8999:8999
  network_mode: "host"
  volumes:
    - /dev:/dev
    - ./:/myappdir
    - /run/udev:/run/udev:ro
  privileged: true
  command: ./scripts/runApp.sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...