web-dev-qa-db-fra.com

Accès Docker aux broches GPIO du Raspberry Pi

Lorsque vous exécutez Docker sur le Raspberry Pi 2, comment pouvons-nous exposer les broches GPIO au conteneur Docker?

33
Nyxynyx

Sur un hôte Linux, il existe trois façons possibles d'accéder aux broches GPIO à partir d'un conteneur Docker.

1. Exécuter Docker avec l'option "--privileged"

Le démarrage d'un conteneur comme celui-ci donnera au conteneur un accès complet aux périphériques de l'hôte, y compris GPIO:

$ docker run --privileged -d whatever

Vérifiez la documentation Docker sur cette option . Ce n'est peut-être pas le meilleur choix selon le degré de rigueur de vos exigences de sécurité.

2. Ajout du périphérique/dev/gpiomem

Plutôt que d'exposer tous les périphériques de l'hôte au conteneur, vous pouvez être spécifique et n'exposer le périphérique/dev/gpiomem au conteneur qu'au moment de l'exécution. Sachez que ce périphérique nécessite la prise en charge des pilotes du noyau dans la distribution Linux de l'hôte. Les versions récentes de Raspbian devraient avoir cela. Votre kilométrage avec d'autres distributions peut varier.

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

3. Utilisation du système de fichiers sysfs sur l'hôte

Le GPIO du Pi est représenté dans le système de fichiers de l'hôte sous/sys/class/gpio. Vous pouvez y accéder avec des privilèges utilisateur via les fichiers virtuels de ce système de fichiers. Utilisez des volumes Docker pour exposer cela à votre conteneur:

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

Gardez à l'esprit que l'utilisation de sysfs pour GPIO sera probablement plus lente que l'approche par périphérique.

Bibliothèques GPIO

Laquelle de ces trois approches correspond à vos besoins dépendra également des bibliothèques que vous utilisez lorsque vous accédez à GPIO. Toutes les bibliothèques ne prennent pas en charge ces trois options.

36
Tobias

Vous utiliseriez probablement docker volumes pour exposer l'interface sysfs. Par exemple, quelque chose comme:

docker run -v /sys:/sys Fedora bash

Cela exposerait /sys sur l'hôte en tant que /sys à l'intérieur du conteneur, et vous auriez accès à /sys/class/gpio hiérarchie.

Si vous utilisiez du code qui accède aux broches GPIO sans utiliser l'interface sysfs, vous devrez exposer le nœud de périphérique qu'il utilise à l'intérieur du conteneur, éventuellement avec quelque chose comme --device argument à docker run.

4
larsks

J'utiliserais cette image: https://github.com/acencini/rpi-python-serial-wiringpi , comme image de base. Ici, vous pouvez facilement accéder à python. Ou vous pouvez décider de télécharger le nœud sur l'image et d'utiliser ces deux bibliothèques npm pour accéder via javascript

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

La base de tout cela est de câblagePi comme vous pouvez le voir dans le Dockerfile, et que vous devez exécuter cette commande lorsque vous exécutez l'image la première fois:

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

Ce qui est important ici, c'est que vous ouvriez les ports de développement et mem pour le câblagePi pour y accéder. Un accès privilégié à/dev/mem est requis par le câblagePi.

2
vonGohren

Si vous exécutez Azure IoT Edge et docker dessus, les étapes suivantes vous aideront.

  1. Ajouter la propriété "Privileged": true dans le fichier deployment.template.json

        "modules": {
         "gpio": {
          "version": "1.0",
          "type": "docker",
          "status": "running",
          "restartPolicy": "always",
          "settings": {
            "image": "${MODULES.gpio}",
            "createOptions": {
             "HostConfig": {
               "Privileged": true
            }
          }
        }
      },
    
  2. Commentez création du module dans le fichier Dockerfile.arm32v7. Moduleuser ne dispose pas de suffisamment d'autorisations et, par conséquent, il ignore l'option Privileged: true. Sans cela, docker fonctionnera avec les privilèges root.

    # RUN useradd -ms /bin/bash moduleuser
    # USER moduleuser
  1. Ajoutez une référence à System.Device.Gpio . Il est actuellement en version préliminaire mais il fonctionne. https://github.com/dotnet/iot
0
sepp

En application avec onoff sur Raspberry Pi 3B +, montage /sys/devices/platform/soc/3f200000.gpio est assez.

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

Je cherche toujours de meilleures solutions.

0
aGuegu