Docker访问Raspberry Pi GPIO引脚

Nyx*_*nyx 28 gpio raspberry-pi docker raspberry-pi2

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

Tob*_*ias 47

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

1.使用"--privileged"选项运行Docker

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

$ docker run --privileged -d whatever
Run Code Online (Sandbox Code Playgroud)

查看有关此选项Docker文档.它可能不是最佳选择,具体取决于您的安全要求有多严格.

2.添加/ dev/gpiomem设备

您可以是特定的,并且只在运行时将/ dev/gpiomem设备公开给容器,而不是将所有主机的设备暴露给容器.请注意,此设备需要在主机的Linux发行版中支持内核驱动程序.最近发布的Raspbian应该有这个.您与其他发行版的里程可能会有所不同.

$ docker run --device /dev/gpiomem -d whatever
Run Code Online (Sandbox Code Playgroud)

3.在主机上使用sysfs文件系统

Pi的GPIO在/ sys/class/gpio下面的主机文件系统中表示.可以通过该文件系统中的虚拟文件使用用户权限访问此项.使用Docker卷将其公开给您的容器:

$ docker run -v /sys:/sys -d whatever
Run Code Online (Sandbox Code Playgroud)

请注意,使用sysfs进行GPIO可能比设备方法慢.

GPIO库

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

  • 我正在使用 libgpiod - 为此我必须映射`/dev/gpiochip0`(或者使用特权模式也可以)。 (3认同)
  • 显然你知道如何给出好的答案。保持这种精神:-) (2认同)

lar*_*sks 7

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

docker run -v /sys:/sys fedora bash
Run Code Online (Sandbox Code Playgroud)

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

如果你使用的是访问GPIO引脚不使用代码sysfs的接口,你就需要公开的任何设备节点它使用的是容器内,可能有类似的--device参数docker run


von*_*ren 6

我会使用这个图像: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
Run Code Online (Sandbox Code Playgroud)

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