是否可以在 docker 容器中使用 npm serialPort?
Is it possible to use npm serialPort from within a docker container?
我有一个节点项目,运行在 ubuntu 的 docker 容器中,主机 machine 也是 ubuntu。
在我的节点项目(用 typescript 编写)中,我正在尝试使用 npm serialport 库。
https://www.npmjs.com/package/serialport
我有台词:
include * as serialport from 'serialport'
// further down
serialport.list((err, list) => {
// after checking for errors
console.log(list);
});
现在,如果我 运行 主机 machine 上的这段代码,我会得到包含大量信息的结果列表。例如,对于一台设备:
{ 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' }
但是当我在 docker 容器中 运行 相同的代码时,我得到以下信息:
{ manufacturer: undefined,
serialNumber: undefined,
pnpId: undefined,
locationId: undefined,
vendorId: undefined,
productId: undefined,
comName: '/dev/ttyUSB0' }
如您所见,大部分信息 returns 未定义。
这样做是为了给 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
应用程序 运行s,并检测 /dev 上有哪些串行端口可用,但未检索到设备信息。
这个link:
表明甚至可能无法做到这一点,至少对于 mac 而言是不可能的。在 linux machine 上可以吗?
如有任何帮助,我们将不胜感激。
以防万一其他人遇到同样的问题,我将 post 我在这里找到的解决方案:
深入研究节点串口的 linux 绑定,我看到 'udevadm info -e' 用于获取所有设备。 运行 容器内的命令提供的信息少于主机上的信息,但这为我提供了找到此页面所需的可通过 google 搜索的信息:
那一页给了我两个解决方案!首先,在卷部分使用 /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
我有一个节点项目,运行在 ubuntu 的 docker 容器中,主机 machine 也是 ubuntu。
在我的节点项目(用 typescript 编写)中,我正在尝试使用 npm serialport 库。
https://www.npmjs.com/package/serialport
我有台词:
include * as serialport from 'serialport'
// further down
serialport.list((err, list) => {
// after checking for errors
console.log(list);
});
现在,如果我 运行 主机 machine 上的这段代码,我会得到包含大量信息的结果列表。例如,对于一台设备:
{ 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' }
但是当我在 docker 容器中 运行 相同的代码时,我得到以下信息:
{ manufacturer: undefined,
serialNumber: undefined,
pnpId: undefined,
locationId: undefined,
vendorId: undefined,
productId: undefined,
comName: '/dev/ttyUSB0' }
如您所见,大部分信息 returns 未定义。
这样做是为了给 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
应用程序 运行s,并检测 /dev 上有哪些串行端口可用,但未检索到设备信息。
这个link:
表明甚至可能无法做到这一点,至少对于 mac 而言是不可能的。在 linux machine 上可以吗?
如有任何帮助,我们将不胜感激。
以防万一其他人遇到同样的问题,我将 post 我在这里找到的解决方案:
深入研究节点串口的 linux 绑定,我看到 'udevadm info -e' 用于获取所有设备。 运行 容器内的命令提供的信息少于主机上的信息,但这为我提供了找到此页面所需的可通过 google 搜索的信息:
那一页给了我两个解决方案!首先,在卷部分使用 /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