在 RaspberryPi 4 上使用 Docker 中的 Node-Red 访问 i²c 总线

Accessing the i²c bus with Node-Red in Docker on a RaspberryPi 4

我目前正在 RaspberryPi 4 上使用 Docker 设置 Home Assistant。 我使用了本教程:https://www.reddit.com/r/homeassistant/comments/cm4tzp/guide_for_installing_on_a_raspberry_pi4_using/ 作为参考 - 到目前为止还不错。

问题是我想使用 Raspberry 的 i²c 接口与不同的设备进行通信。 docker-compose.yaml 文件的相关部分如下所示:

version: '3.8'
services:

[...]
  node-red:
      container_name: node-red
      image: nodered/node-red:latest
      user: "1000:1000"
      privileged: true
      ports:
        - "1880:1880"
      volumes:
        - /opt/node-red:/data
        - /etc/localtime:/etc/localtime:ro
        - /etc/timezone:/etc/timezone:ro
      devices:
        - /dev/mem:/dev/mem
        - /dev/gpiomem:/dev/gpiomem
        - /dev/i2c-1:/dev/i2c-1
      restart: unless-stopped
[...]

我将用户映射到 pi(据我所知,user: "1000:1000" 行就是这样做的)并将容器设置为特权容器。

对于上下文,这是一些命令的结果(对于 ls -l 我只在相关行中输入):

pi@raspberrypi:/dev $ ls -l
crw-rw----  1 root i2c      89,   1 Jul  3 17:17 i2c-1
pi@raspberrypi:/dev $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi gpio docker i2c
id pi
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),109(netdev),999(spi),997(gpio),995(docker),998(i2c)
pi@raspberrypi:~ $ docker --version
Docker version 19.03.12, build 48a6621

当我尝试通过调试选项卡中的 I²C Node-Red 输出 Error: EACCES: permission denied, open '/dev/i2c-1' 发送内容时。

当我用 user: "998:998" 替换 user: "1000:1000" 行时,我的 Node-Red Flow 工作(我可以将数据发送到 Arduino)但我无法保存任何新的(Node-Red文件归 pi 所有。

当我 sudo chmod 666 /dev/i2c-1 时,它也可以工作,但它不安全并且会在 Raspberry 重新启动时重置。

我也可以将 /dev/i2c-1 的所有权更改为 pi,当我尝试时它起作用了,但如果可能的话我宁愿保留 i2c 组。

为什么 Node-Red 容器不能按原样访问 /dev/i2c-1

让它发挥作用的最佳方法是什么?

我刚刚将 user: "1000:1000" 更改为 user: "1000:998",一切似乎都正常。在找到更好的解决方案之前,我只会访问 pi 或 i2c 组拥有的目录。

也许我会为此创建一个群组。

情况似乎是,虽然容器内外的 UID 相同,但容器内的用户无权访问外部用户所属的组所拥有的目录.