在 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 相同,但容器内的用户无权访问外部用户所属的组所拥有的目录.
我目前正在 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 相同,但容器内的用户无权访问外部用户所属的组所拥有的目录.