Доступ к докеру для контактов с малиной Pi GPIO

При запуске Docker на Raspberry Pi 2, как мы можем вывести контакты GPIO в контейнер Docker?

Ответ 1

На хосте Linux есть три возможных способа получить доступ к контактам GPIO из контейнера Docker.

1. Запуск Docker с опцией "--privileged"

Запуск такого контейнера даст контейнеру полный доступ к основным устройствам, включая GPIO:

$ docker run --privileged -d whatever

Проверьте документацию Docker на эту опцию. Это может быть не лучший выбор в зависимости от того, насколько жесткими являются ваши требования безопасности.

2. Добавление устройства /dev/gpiomem

Вместо того, чтобы отображать все хост-устройства в контейнере, вы можете быть конкретными и только подвергать устройство /dev/gpiomem контейнеру во время выполнения. Имейте в виду, что этому устройству требуется поддержка драйверов ядра в дистрибутиве хоста Linux. Последние выпуски Raspbian должны иметь это. Ваш пробег с другими дистрибутивами может отличаться.

$ docker run --device /dev/gpiomem -d whatever

3. Использование файловой системы sysfs на хосте

Pi GPIO представлен в файловой системе хоста под /sys/class/gpio. Доступ к ним можно получить с помощью прав пользователя через виртуальные файлы в этой файловой системе. Используйте тома Докера, чтобы выставить это в свой контейнер:

$ docker run -v /sys:/sys -d whatever

Учтите, что использование sysfs для GPIO, вероятно, будет медленнее, чем подход к устройству.

Библиотеки GPIO

Какой из этих трех подходов соответствует вашим потребностям, также будет зависеть от библиотек, которые вы используете при доступе к GPIO. Не все библиотеки поддерживают все три из этих параметров.

Ответ 2

Вы, вероятно, используете docker volumes, чтобы открыть интерфейс sysfs. Например, что-то вроде:

docker run -v /sys:/sys fedora bash

Это приведет к тому, что /sys на хосте будет /sys внутри контейнера, и вы получите доступ к иерархии /sys/class/gpio.

Если вы использовали код, который обращался к контактам GPIO, не используя интерфейс sysfs, вам нужно было бы открыть любое устройство node, которое оно использует внутри контейнера, возможно, с чем-то вроде аргумента --device на docker run.

Ответ 3

Я бы использовал это изображение: https://github.com/acencini/rpi-python-serial-wiringpi в качестве базового изображения. Здесь вы можете легко получить доступ к python. Или вы можете решить загрузить node на изображение и использовать эти две библиотеки npm для доступа через javascript

https://github.com/bryan-m-hughes/raspi - https://github.com/bryan-m-hughes/raspi-gpio

Основанием для всего этого является проводкаPi, как вы можете видеть в файле Docker, и что вам нужно запустить эту команду при первом запуске изображения:

docker run --device /dev/ttyAMA0:/dev/ttyAMA0 --device /dev/mem:/dev/mem --privileged -ti acencini/rpi-python-serial-wiringpi /bin/bash

Важно то, что вы открываете dev-порты и mem для подключенияPi для доступа к нему. Привилегированный доступ к /dev/mem требуется по проводке.

Ответ 4

В приложении с onoff на малине pi 3B+ достаточно установить /sys/devices/platform/soc/3f200000.gpio.

docker run -v /sys/devices/platform/soc/3f200000.gpio:/sys/devices/platform/soc/3f200000.gpio ...

Я все еще ищу лучшие решения.