У меня есть простой пример проекта Node-RED здесь, на GitHub, где я пытается взаимодействовать с несколькими GPIO на Raspberry Pi под управлением Buster. Если я запустил этот проект прямо на Pi, он будет работать нормально. Если я запустил его как модуль, развернув через Azure IoT Edge, я не смогу взаимодействовать с тем же GPIO, даже если я развернул его с помощью этих параметров создания контейнера ...
{
"HostConfig": {
"PortBindings": {
"1880/tcp": [
{
"HostPort": "80"
}
]
},
"Privileged": true
}
}
... из /kpmartinhfi/gpio-poc:latest
в Docker Hub, созданного с использованием docker buildx build --platform linux/arm/v7 -t kpmartinhfi/gpio-poc:latest . --push
.
Пользовательский интерфейс редактора Node-RED доступен по адресу: 80 на устройстве, поэтому он в основном работает, но при попытке использовать GPIO возникают ошибки доступа / разрешений:
16 Sep 19:21:33 - [info] Starting flows
16 Sep 19:21:33 - [info] Started flows
16 Sep 19:21:33 - [info] [rpi-gpio out:Buzzer (GPIO20)] err: Traceback (most recent call last):
File "/usr/src/node-red/node_modules/@node-red/nodes/core/hardware/nrgpio.py", line 84, in <module>
:
16 Sep 19:21:33 - [info] [rpi-gpio out:Buzzer (GPIO20)] err: GPIO.setup(pin,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
:
16 Sep 19:21:33 - [info] [rpi-gpio out:Relay (GPIO26)] err: Traceback (most recent call last):
File "/usr/src/node-red/node_modules/@node-red/nodes/core/hardware/nrgpio.py", line 84, in <module>
GPIO.setup(pin,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
:
16 Sep 19:21:33 - [info] [rpi-gpio out:Buzzer (GPIO20)] closed
16 Sep 19:21:33 - [info] [rpi-gpio out:Relay (GPIO26)] closed
16 Sep 19:21:33 - [info] [rpi-gpio out:Relay (GPIO16)] err: Traceback (most recent call last):
File "/usr/src/node-red/node_modules/@node-red/nodes/core/hardware/nrgpio.py", line 84, in <module>
:
16 Sep 19:21:33 - [info] [rpi-gpio out:Relay (GPIO16)] err: GPIO.setup(pin,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
:
16 Sep 19:21:33 - [info] [rpi-gpio out:Relay (GPIO16)] closed
16 Sep 19:21:36 - [info] [rpi-gpio out:Relay (GPIO16)] out: 0
16 Sep 19:21:36 - [error] [rpi-gpio out:Relay (GPIO16)] nrpgio python command not running
16 Sep 19:21:37 - [info] [rpi-gpio out:Relay (GPIO16)] out: 1
16 Sep 19:21:37 - [error] [rpi-gpio out:Relay (GPIO16)] nrpgio python command not running
Как лучше всего решить эту проблему, чтобы система не оставалась в ужасно небезопасном состоянии?
Моя попытка использовать Privileged:true
была задумана как «взлом», чтобы просто посмотреть, как все работает, но я подозреваю, что это не лучший способ перейти к «производству».
Интересно, нужно ли мне что-то делать в Dockerfile
, например, добавить пользователя Node-RED по умолчанию в группу с доступом к GPIO, но, поскольку каждая попытка занимает довольно много времени, я подумал, что сначала спрошу. :)