Lorsque vous exécutez Docker sur le Raspberry Pi 2, comment pouvons-nous exposer les broches GPIO au conteneur Docker?
Sur un hôte Linux, il existe trois façons possibles d'accéder aux broches GPIO à partir d'un conteneur Docker.
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é.
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
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.
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.
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
.
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.
Si vous exécutez Azure IoT Edge et docker dessus, les étapes suivantes vous aideront.
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
}
}
}
},
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
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.