linux - 使用 --device 标志时,在主机上创建的新设备节点不会反射(reflect)在 Docker 容器中

标签 linux docker usb device mknod

我正在运行一个具有以下选项的容器: docker run -d --device=/dev/bus/usb:/dev/bus/usb --device=/dev/ttyS0:/dev/ttyS0 instr_img

在容器内,我有一个 Python 代码,它重置了一个 USB 设备,这反过来导致主机上 '/dev/bus/usb/002/005' 中的一个设备文件被删除,一个新文件 (/dev/bus/usb/002/006) 在其位置创建。问题是容器内的“/dev/bus/usb/002/005”仍然存在,而“/dev/bus/usb/002/006”无处可寻。主机和容器上的目录“/dev/bus/usb/002”现在不同步。结果,容器内的代码执行抛出异常,因为它无法与 USB 设备通信。我通过在容器中手动创建一个新设备文件 (mknod) 进行确认,发现它没有同步到主机,反之亦然。这是 Docker 中不受支持的功能还是错误?

>docker version
Client:
Version: 1.9.0
API version: 1.21
Go version: go1.4.2
Git commit: 76d6bc9
Built: Tue Nov 3 17:48:04 UTC 2015
OS/Arch: linux/amd64

Server:
Version: 1.9.0
API version: 1.21
Go version: go1.4.2
Git commit: 76d6bc9
Built: Tue Nov 3 17:48:04 UTC 2015
OS/Arch: linux/amd64

>docker info
Containers: 66
Images: 313
Server Version: 1.9.0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 445
Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.19.0-47-generic
Operating System: Ubuntu 15.04
CPUs: 4
Total Memory: 7.69 GiB
Name:my-host-1
ID: VIT4:S2P3:Q4TY:A3I4:L4WH:HFWJ:I36U:PBTV:B3VW:NFXB:LDNM:KY7G
Username: myuser
Registry: https://index.docker.io/v1/
WARNING: No swap limit support

>uname -a
Linux my-host-1 3.19.0-47-generic #53-Ubuntu SMP Mon Jan 18 14:02:48 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我的解决方法是发出一个 mknod 命令来创建一个新的设备文件,每次发生设备重置时,次设备号都会增加 1(从之前的数字开始);然而,这不是一个干净的 hack,因为我需要进行一些检查,因为这个程序在 Docker 容器内外的多个环境中使用。对于这个用例,我很可能没有正确使用 Docker,因为我对 Docker 非常陌生(菜鸟)。 非常感谢一些有经验的 Docker 用户的评论/见解。如果我找不到一个干净的解决方法来解决这个问题,那么将这个程序 docker 化对我来说可能是一个交易破坏者。

提前感谢您的意见!

最佳答案

根据所有在线研究和一些使用“--device”的实验,我发现此选项不支持临时(热插拔)设备。遗憾的是 Docker 文档没有清楚地说明这一点,如果有的话。我只在网上阅读了一位用户的一条评论,其中顺便提到了它。对于那些想为这些设备使用“--device”的人,不要;请改用“--privileged”和“-v”选项。这将避免您必须指定确切的设备文件名,例如/dev/bus/usb/002/088,您可以只指定/dev/bus/usb。 '--device' 选项需要实际的设备文件名才能工作。

关于linux - 使用 --device 标志时,在主机上创建的新设备节点不会反射(reflect)在 Docker 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35071952/

相关文章:

mysql - Jenkins docker 上未知的 MySQL 服务器主机

docker - 无法创建 tarball : archive/tar: write too long

android - 在 Android 上启用 USB 调试

安卓手机usb

java - Zebra GK420d ZPL 打印机通过 USB 在 Java 中的状态

linux - Bash 替换文件中的文本

linux - 脚本持续运行数小时

linux - 如何使用 "sed"命令转到特定列或部分行?

linux - 如何决定何时使用内存屏障

python - 无法在docker内连接多个python socket.io