【问题标题】:Docker container can't see a serial port deviceDocker容器看不到串口设备
【发布时间】:2023-08-08 09:46:01
【问题描述】:

我正在尝试运行一个可以访问主机上的串行端口的 Docker 容器。

这是我所做的:

  • 我用的是 Mac
  • 主机上安装的驱动程序 (http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41)
  • 插入设备
  • ls /dev/t*返回 /dev/tty.usbserial - 成功了
  • 运行容器docker run -it --privileged -v /dev:/dev node:4.4.0 /bin/bash,然后在未返回/dev/tty.usbserial 设备的容器内运行ls /dev/t*...

我玩了很多不同的参数变化,但我还没有找到有效的:)

--device 标志也不适合我,因为设备可能会重新连接,并且名称可能与 /dev/tty.usbserial 不同。

【问题讨论】:

  • 您说您在 Mac 上运行?这是否意味着您正在使用 docker-machine 之类的?如果是这样,问题可能与运行 docker 容器的虚拟机看不到设备有关
  • 我正在使用官方的 docker 工具箱 (docker.com/products/docker-toolbox)。然后运行Docker Quickstart Terminal,在这一步我确实看到了设备,就在我运行一个新容器之后,我没有看到其中的设备。
  • 如果你运行docker-machine ssh <machinename>,你能看到/dev中的设备吗? Docker 快速入门终端只是为您打开一个终端,其中设置了所有环境变量,以与 VM 中的 docker 守护进程对话。见此链接:docs.docker.com/machine/reference/ssh
  • @sprkysnrky 我运行docker-machine ssh default,然后列出了/dev,没有找到设备...

标签: bash docker serial-port usb device


【解决方案1】:

您可以检查Notification of new USB devices in docker container(来自Guido Diepen -- gdiepen)中描述的脚本是否有帮助。

他也使用--privileged 参数运行他的容器以允许它访问设备。并且他在启动所述容器时使用参数-v /dev/bus/usb:/dev/bus/usb将主机目录/dev/bus/usb挂载到容器内的/dev/bus/usb目录。

该脚本同时使用inotifywaitlsusb 来等待设备被(拔出)并检查它是否是我们感兴趣的设备。

inotifywait 将继续侦听dev/bus/usb 目录下的inode 创建/删除事件,并在刚刚创建对应于相关设备的inode 时执行命令。

另请参阅,一旦您检测到插入的 USB 设备,How to get Bus and Device relationship for a /dev/ttyUSB(与 Docker 无关,但仍然相关)。

【讨论】:

  • 谢谢!需要尝试一下。
  • 我和你上面提到的帖子的作者讨论过。该解决方案不应该起作用,因为在运行docker-machine 时设备不可见。
  • “如何获取 /dev/ttyUSB 的总线和设备关系”(最后一段)的链接(有效)缺失 - 是 http://。跨度>
  • @PeterMortensen 谢谢。我已经恢复了丢失的链接。
【解决方案2】:

正如@pgayvallet on GitHub所指出的:

由于守护程序在 Docker Desktop 中的虚拟机内运行,实际上不可能与虚拟机内的容器共享 mac 主机设备,这绝对不可能。 p>

【讨论】: