При запуске Docker на Raspberry Pi 2, как мы можем вывести контакты GPIO в контейнер Docker?
Доступ к докеру для контактов с малиной Pi GPIO
Ответ 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 ...
Я все еще ищу лучшие решения.