是否可以在 docker 容器内使用 npm serialPort?

Mic*_*son 1 ubuntu node.js node-serialport docker

我有一个node项目,在ubuntu的docker容器中运行,主机也是ubuntu。

在我的节点项目(用打字稿编写)中,我尝试使用 npm 串行端口库。

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

我有以下几行:

include * as serialport from 'serialport'

// further down

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

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

});
Run Code Online (Sandbox Code Playgroud)

现在,如果我在主机上运行此代码,我会得到包含大量信息的结果列表。例如,对于一台设备:

{ 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' }
Run Code Online (Sandbox Code Playgroud)

但是当我在 docker 容器中运行相同的代码时,我得到以下结果:

{ manufacturer: undefined,
 serialNumber: undefined,
 pnpId: undefined,
 locationId: undefined,
 vendorId: undefined,
 productId: undefined,
 comName: '/dev/ttyUSB0' }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,大多数信息返回为未定义。

这样做可以为 docker 容器提供特权状态和对 /dev 卷的访问权限。例如在 docker-compose 中

myapp:
 image: myappimage
 ports: 8999:8999
 volumes:
   - /dev:/dev
   - ./:/myappdir
 privileged: true
 command: ./scripts/runApp.sh
Run Code Online (Sandbox Code Playgroud)

或者跑步

docker run --privileged -v /dev:/dev -v /path/to/my/app:/app node:4.4.0 ./scripts/runApp.sh
Run Code Online (Sandbox Code Playgroud)

应用程序运行,并检测 /dev 上有哪些串行端口可用,但未检索设备信息。

这个链接:

Docker容器看不到串口设备

表明甚至可能无法做到这一点,至少对于 mac 来说是不可能的。在linux机器上可以吗?

任何帮助将不胜感激。

Mic*_*son 7

为了防止其他人遇到同样的问题,我将在这里发布我找到的解决方案:

深入研究节点串行端口的 Linux 绑定,我发现“udevadm info -e”用于获取所有设备。在容器内运行该命令提供的信息少于在主机上运行的信息,但这就是为我提供了查找此页面所需的可通过谷歌搜索的信息:

udevadm 不显示 docker 容器内的所有属性

那一页给了我两个解决方案!首先,在卷部分中使用/run/udev:/run/udev:ro串行端口来工作,然后用于network_mode:'host'在插入设备时检测更改(我使用节点USB 检测)。

所以在我的 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
Run Code Online (Sandbox Code Playgroud)