docker-compose devices 将所有设备从本地映射到容器

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)

有效,但当设备被分配不同的编号时无效,因此需要将它们全部映射。

rzl*_*vmp 2

docker-compose能够读取YAMLSTDIN因此只需动态生成它即可。

假设我们的原始文件是:

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)

利润

另外,你可以检查这个答案