web-dev-qa-db-ja.com

Raspberry Pi GPIOピンへのDockerアクセス

Raspberry Pi 2でDockerを実行する場合、GPIOピンをDockerコンテナーに公開するにはどうすればよいですか?

33
Nyxynyx

Linuxホストでは、Dockerコンテナー内からGPIOピンにアクセスする方法が3つあります。

1.「--privileged」オプションを指定してDockerを実行する

このようなコンテナーを開始すると、コンテナーに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ボリュームを使用して、これをコンテナーに公開します。

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

GPIOにsysfsを使用すると、デバイスアプローチよりも遅くなることに注意してください。

GPIOライブラリ

これらの3つのアプローチのどれがニーズに合うかは、GPIOにアクセスするときに使用するライブラリにも依存します。すべてのライブラリがこれら3つのオプションすべてをサポートしているわけではありません。

36
Tobias

おそらくdocker volumesを使用してsysfsインターフェースを公開します。たとえば、次のようなものです。

docker run -v /sys:/sys Fedora bash

これにより、ホスト上の/sysがコンテナ内の/sysとして公開され、/sys/class/gpio階層にアクセスできるようになります。

sysfsインターフェースを使用せずにGPIOピンにアクセスするコードを使用している場合、コンテナー内で使用しているデバイスノードを公開する必要があります。--device引数をdocker run

4
larsks

私はこの画像を使用します: 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で必要です。

2
vonGohren

Azure IoT Edgeとその上でDockerを実行している場合、次の手順が役立ちます。

  1. プロパティ "Privileged":trueをファイルdeployment.template.jsonに追加します

        "modules": {
         "gpio": {
          "version": "1.0",
          "type": "docker",
          "status": "running",
          "restartPolicy": "always",
          "settings": {
            "image": "${MODULES.gpio}",
            "createOptions": {
             "HostConfig": {
               "Privileged": true
            }
          }
        }
      },
    
  2. ファイルDockerfile.arm32v7でのmoduleuser作成をコメント化します。 Moduleuserには十分な権限がないため、Privileged:trueオプションは無視されます。これがないと、Dockerはroot権限で実行されます。

    # RUN useradd -ms /bin/bash moduleuser
    # USER moduleuser
  1. System.Device.Gpioへの参照を追加します。プレリリースでは最新ですが、動作します。 https://github.com/dotnet/iot
0
sepp

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 ...

私はまだより良い解決策を探しています。

0
aGuegu