55

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

4

5 回答 5

103

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

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

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

GPIO 库

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

于 2018-01-12T22:15:36.670 回答
7

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

docker run -v /sys:/sys fedora bash

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

如果您使用的代码在不使用接口的情况下访问 GPIO 引脚,您将需要在容器内公开它正在使用的任何设备节点,可能带有sysfs类似于.--devicedocker run

于 2015-05-05T18:29:16.643 回答
6

我将使用此图像: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 的特权访问。

于 2015-05-15T15:41:56.857 回答
0

如果您在其上运行 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
于 2019-08-10T22:05:01.897 回答
0

In application with onoff on raspberry pi 3B+, mounting /sys/devices/platform/soc/3f200000.gpio and /sys/class/gpio is enough.

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

I am still looking for better solutions.

于 2018-12-05T06:43:08.023 回答