【问题标题】:Docker Access to Raspberry Pi GPIO PinsDocker 访问 Raspberry Pi GPIO 引脚
【发布时间】:2015-07-15 14:08:26
【问题描述】:

在 Raspberry Pi 2 上运行 Docker 时,我们如何将 GPIO 引脚暴露给 Docker 容器?

【问题讨论】:

    标签: docker raspberry-pi gpio raspberry-pi2


    【解决方案1】:

    在 Linux 主机上,可以通过三种方式从 Docker 容器中访问 GPIO 引脚。

    1。使用“--privileged”选项运行 Docker

    像这样启动容器将使容器能够完全访问主机的设备,包括 GPIO:

    $ docker run --privileged -d whatever
    

    检查Docker documentation on this option。根据您的安全要求有多严格,这可能不是最佳选择。

    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
    

    请注意,将 sysfs 用于 GPIO 可能会比设备方法慢。

    GPIO 库

    这三种方法中哪一种适合您的需求还取决于您在访问 GPIO 时使用的库。并非所有库都支持所有这三个选项。

    【讨论】:

    • 显然你知道如何给出好的答案。保持这种精神:-)
    • 很好的答案! :)
    • 使用 docker-compose.yml 版本 3 的新 docker swarm 模式不允许特权选项或设备选项。我在我的 docker 容器中使用 RPi.GPIO python 库。 sysfs 方法似乎不适用于该库。有人知道其他选择吗?
    • 我正在使用 libgpiod - 为此我必须映射 /dev/gpiochip0(或者使用特权模式也可以)。
    【解决方案2】:

    您可能会使用docker volumes 来公开sysfs 接口。例如,类似:

    docker run -v /sys:/sys fedora bash
    

    这会将主机上的/sys 公开为容器内的/sys,您将可以访问/sys/class/gpio 层次结构。

    如果您使用的代码在不使用sysfs 接口的情况下访问 GPIO 引脚,您将需要在容器内公开它正在使用的任何设备节点,可能使用类似于--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

      正如您在 Dockerfile 中看到的那样,整个事情的基础是wiringPi,并且您必须在第一次运行映像时运行此命令:

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

      这里重要的是您打开 dev 端口和 mem 以供 WiringPi 访问它。 WiringPi 需要对 /dev/mem 的特权访问。

      【讨论】:

      • 我能够通过使用--device /dev/gpiomem:/dev/gpiomem不使用 使用--privileged 让wiringpi 在容器中工作。
      【解决方案4】:

      如果您在其上运行 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

      【讨论】:

        【解决方案5】:

        在树莓派 3B+ 上使用 onoff 的应用程序中,安装 /sys/devices/platform/soc/3f200000.gpio/sys/class/gpio 就足够了。

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

        我仍在寻找更好的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-01
          • 2018-10-03
          • 1970-01-01
          • 1970-01-01
          • 2015-05-31
          相关资源
          最近更新 更多