Docker访问Raspberry Pi GPIO引脚

时间:2015-05-05 17:44:17

标签: docker raspberry-pi gpio raspberry-pi2

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

5 个答案:

答案 0 :(得分:29)

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

1。使用" - 特权"运行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时使用的库。并非所有库都支持所有这三个选项。

答案 1 :(得分:4)

您可能会使用docker volumes来公开sysfs界面。例如,像:

docker run -v /sys:/sys fedora bash

这会在主机上将/sys公开为/sys,并且您可以访问/sys/class/gpio层次结构。

如果您使用的代码在不使用sysfs接口的情况下访问GPIO引脚,则需要在容器内公开它所使用的任何设备节点,可能需要--device参数{ {1}}。

答案 2 :(得分:2)

我会使用此图片:https://github.com/acencini/rpi-python-serial-wiringpi作为基本图片。在这里,您可以使用python轻松访问。或者您可以决定将节点下载到图像上并使用这两个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 for wiringPi来访问它。 wiringPi需要特权访问/ dev / mem。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

如果您正在运行Azure IoT Edge和docker,则以下步骤将为您提供帮助。

  1. 将属性“特权”: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