我为我的 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