Sla*_*lov 5 tty docker docker-compose
我有这个 docker-compose 服务,我正在尝试使其工作。
app:
build: ./
volumes:
- .:/app:delegated
devices:
- ${DEVICE:-/dev/null}:-/dev/ttyUSB*
Run Code Online (Sandbox Code Playgroud)
运行时响应docker-compose up app
Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB*": no such file or directory
Run Code Online (Sandbox Code Playgroud)
这里的想法是从本地获取所有匹配的设备/dev/ttyUSB*并在容器内创建它们。这样我就可以在容器中拥有 0-N 个设备,处理没有设备连接时的场景。我也不必知道每个设备的tty<id>
我读过一些旧答案,例如: 在 docker-compose 中映射所有可用设备 ,但这些要么使用
--privileged或者不回答如何复制和访问(所有|无设备)的问题。
我知道:
Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB*": no such file or directory
Run Code Online (Sandbox Code Playgroud)
有效,但当设备被分配不同的编号时无效,因此需要将它们全部映射。
docker-compose能够读取YAML,STDIN因此只需动态生成它即可。
假设我们的原始文件是:
abc:
container_name: abc
image: alpine
entrypoint: ["watch", "-n", "5", "ls"]
Run Code Online (Sandbox Code Playgroud)
设备是:
$ ls -l /dev/ttyS*
crw-rw-rw- 1 root root 4, 64 Nov 11 09:34 /dev/ttyS0
crw-rw-rw- 1 root root 4, 65 Nov 11 09:34 /dev/ttyS1
crw-rw-rw- 1 root root 4, 66 Nov 11 09:34 /dev/ttyS2
crw-rw-rw- 1 root root 4, 67 Nov 11 09:34 /dev/ttyS3
Run Code Online (Sandbox Code Playgroud)
因此,让我们将这些设备添加到YAML:
$ printf '%s\n%s' "$(cat docker-compose.yml)" "$(if [ "$(ls /dev/ttyS*)x" != "x" ]; then echo -e " devices:"; for D in /dev/ttyS*; do echo " - ${D}:${D//ttyS/ttyUSB}"; done; fi )"
Run Code Online (Sandbox Code Playgroud)
将打印:
abc:
container_name: abc
image: alpine
entrypoint: ["watch", "-n", "5", "ls"]
devices:
- /dev/ttyS0:/dev/ttyUSB0
- /dev/ttyS1:/dev/ttyUSB1
- /dev/ttyS2:/dev/ttyUSB2
- /dev/ttyS3:/dev/ttyUSB3
Run Code Online (Sandbox Code Playgroud)
现在让我们尝试使用以下命令运行 docker 容器STDIN:
$ printf '%s\n%s' "$(cat docker-compose.yml)" "$(if [ "$(ls /dev/ttyS*)x" != "x" ]; then echo -e " devices:"; for D in /dev/ttyS*; do echo " - ${D}:${D//ttyS/ttyUSB}"; done; fi )" | docker-compose -f /dev/stdin -f docker-compose.yml up -d
Run Code Online (Sandbox Code Playgroud)
Creating abc ... done
Run Code Online (Sandbox Code Playgroud)
让我们附加到容器并检查设备:
Creating abc ... done
Run Code Online (Sandbox Code Playgroud)
利润
另外,你可以检查这个答案
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |