Raspberry Pi 2でDockerを実行する場合、GPIOピンをDockerコンテナーに公開するにはどうすればよいですか?
Linuxホストでは、Dockerコンテナー内からGPIOピンにアクセスする方法が3つあります。
このようなコンテナーを開始すると、コンテナーにGPIOを含むホストのデバイスへのフルアクセスが付与されます。
$ docker run --privileged -d whatever
このオプションのDockerドキュメント を確認してください。セキュリティ要件の厳しさによっては、これが最善の選択ではない場合があります。
ホストのすべてのデバイスをコンテナに公開するのではなく、具体的に指定して、実行時に/ dev/gpiomemデバイスのみをコンテナに公開できます。このデバイスは、ホストのLinuxディストリビューション内でカーネルドライバーのサポートを必要とすることに注意してください。 Raspbianの最近のリリースではこれが必要です。他のディストリビューションとの距離は異なる場合があります。
$ docker run --device /dev/gpiomem -d whatever
PiのGPIOは、ホストのファイルシステム内の/ sys/class/gpioの下に表示されます。これは、そのファイルシステムの仮想ファイルを介してユーザー権限でアクセスできます。 Dockerボリュームを使用して、これをコンテナーに公開します。
$ docker run -v /sys:/sys -d whatever
GPIOにsysfsを使用すると、デバイスアプローチよりも遅くなることに注意してください。
これらの3つのアプローチのどれがニーズに合うかは、GPIOにアクセスするときに使用するライブラリにも依存します。すべてのライブラリがこれら3つのオプションすべてをサポートしているわけではありません。
おそらくdocker volumes
を使用してsysfs
インターフェースを公開します。たとえば、次のようなものです。
docker run -v /sys:/sys Fedora bash
これにより、ホスト上の/sys
がコンテナ内の/sys
として公開され、/sys/class/gpio
階層にアクセスできるようになります。
sysfs
インターフェースを使用せずにGPIOピンにアクセスするコードを使用している場合、コンテナー内で使用しているデバイスノードを公開する必要があります。--device
引数をdocker run
。
私はこの画像を使用します: https://github.com/acencini/rpi-python-serial-wiringpi 、ベース画像として。ここでは、Pythonを使用して簡単にアクセスできます。または、ノードをイメージにダウンロードし、これら2つのnpmライブラリを使用してjavascript経由でアクセスすることもできます
https://github.com/bryan-m-hughes/raspi - https://github.com/bryan-m-hughes/raspi-gpio
Dockerfileで確認できるように、全体の基本はwireringPiであり、初めてイメージを実行するときにこのコマンドを実行する必要があります。
docker run --device /dev/ttyAMA0:/dev/ttyAMA0 --device /dev/mem:/dev/mem --privileged -ti acencini/rpi-python-serial-wiringpi /bin/bash
ここで重要なのは、wirelessPiがアクセスできるように、devポートとmemを開くことです。/dev/memへの特権アクセスは、wiringPiで必要です。
Azure IoT Edgeとその上でDockerを実行している場合、次の手順が役立ちます。
プロパティ "Privileged":trueをファイルdeployment.template.jsonに追加します
"modules": {
"gpio": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "${MODULES.gpio}",
"createOptions": {
"HostConfig": {
"Privileged": true
}
}
}
},
ファイルDockerfile.arm32v7でのmoduleuser作成をコメント化します。 Moduleuserには十分な権限がないため、Privileged:trueオプションは無視されます。これがないと、Dockerはroot権限で実行されます。
# RUN useradd -ms /bin/bash moduleuser
# USER moduleuser
Raspberry Pi 3B +で onoff を使用するアプリケーションでは、/sys/devices/platform/soc/3f200000.gpio
をマウントするだけで十分です。
docker run -v /sys/devices/platform/soc/3f200000.gpio:/sys/devices/platform/soc/3f200000.gpio ...
私はまだより良い解決策を探しています。