获取 Docker 容器内 Raspi 的 CPU 温度

获取 Docker 容器内 Raspi 的 CPU 温度

我为我的 Raspberry Pi 4 构建了一个小型 ASP.NET Core 应用程序,它可以让我控制风扇(看这里)。该应用程序部署为一个小型独立 Linux 应用程序,在我的 Raspi 裸机上运行。

为了测量温度,我调用vcgencmd measure_temp了 Raspi,它为我提供了实际温度。

由于各种原因,我更喜欢在 Docker 容器中运行此应用程序:

  • Linux 中不再需要手动注册服务,Docker 功能--restart-always可以处理这个问题。
  • 不再需要从 GitHub 下载最新版本、提取应用程序并将其标记为可执行文件。

但我不知道如何从容器内检索 Raspi 的温度。

我已经尝试将 Raspi 的目录映射/usr/bin//opt/vc/bin/Docker 容器并vcgencmd从内部调用 - 但由于缺少依赖项而失败。
我已经在 Stack Overflow 上找到了一个答案,建议在 Raspi 上创建一个命名管道,然后从容器内使用该管道。但是,如果我必须设置诸如命名管道之类的东西,这就会消除容器的美感。

长话短说:有没有办法从 Docker 容器内获取 Raspi 当前的 CPU 温度?

谢谢!

答案1

如果我们只是安装/opt/vc在容器内......

docker run -it --rm -v /opt/vc:/opt/vc debian:stretch /opt/vc/bin/vcgencmd measure_temp

...它失败了:

/opt/vc/bin/vcgencmd: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory

我们到哪里去找libvchiq_arm.so?我们可以通过以下方法ldd来了解:

$ ldd /opt/vc/bin/vcgencmd
        linux-vdso.so.1 (0x7efe7000)
        /usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0x76f79000)
        libvchiq_arm.so => /opt/vc/lib/libvchiq_arm.so (0x76f52000)
        libvcos.so => /opt/vc/lib/libvcos.so (0x76f39000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76f0f000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76efc000)
        librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x76ee5000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76d97000)
        /lib/ld-linux-armhf.so.3 (0x76f8e000)

这表明我们vcgencmd需要两个可以在 中找到的库/opt/vc/lib。这些都是可用的在容器中,但容器环境不知道在/opt/vc/lib.我们可以通过设置来解决这个问题LD_LIBRARY_PATH

docker run -it --rm -v /opt/vc:/opt/vc -e LD_LIBRARY_PATH=/opt/vc/lib debian:stretch /opt/vc/bin/vcgencmd measure_temp

失败的原因是:

VCHI initialization failed

太棒了,我们已经解决了缺少库的问题!我怀疑vcgencmd正在寻找容器中不可用的设备。我们可以通过vcgencmd在以下主机的控制下运行来弄清楚这是什么strace

strace -o /tmp/trace  -f -s 80 /opt/vc/bin/vcgencmd measure_temp

/dev现在我们在 中查找/tmp/trace,我们发现:

6868  openat(AT_FDCWD, "/dev/vchiq", O_RDWR|O_LARGEFILE) = 3

所以我们需要暴露/dev/vchiq容器内部。我们可以使用以下--device选项来做到这一点:

docker run -it --rm -v /opt:/opt -e LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq debian:stretch /opt/vc/bin/vcgencmd measure_temp

现在报告:

temp=69.3'C

我们已经成功vcgencmd在容器内运行。

答案2

@larsks 的回答, 是很棒的。然而,现在在 RaspberryPI 4 中Debian 11 (bulleye) aarch64,他们已经放置了vcgencmd/opt/vc/bin/vcgencmd/usr/bin/vcgencmd。因此,这是更新版本穆88解决方案:

docker run -it --rm -v /usr:/usr -e LD_LIBRARY_PATH=/usr/lib --device /dev/vchiq debian:stretch /usr/bin/vcgencmd measure_temp

相关内容