mu8*_*u88 0 container raspberry-pi docker
我为我的 Raspberry Pi 4 构建了一个小型 ASP.NET Core 应用程序,它可以让我控制风扇(请参阅此处)。该应用程序部署为一个小型独立 Linux 应用程序,在我的 Raspi 裸机上运行。
为了测量温度,我调用vcgencmd measure_temp
了 Raspi,它为我提供了实际温度。
由于各种原因,我更喜欢在 Docker 容器中运行此应用程序:
--restart-always
可以处理这个问题。但我不知道如何从容器内检索 Raspi 的温度。
我已经尝试将 Raspi 的目录映射到 Docker 容器并从内部调用/usr/bin/
-但由于缺少依赖项而失败。
我已经在 Stack Overflow 上找到了一个答案,建议在 Raspi 上创建一个命名管道,然后从容器内使用该管道。但是,如果我必须设置诸如命名管道之类的东西,这就会消除容器的美感。/opt/vc/bin/
vcgencmd
长话短说:有没有办法从 Docker 容器内获取 Raspi 当前的 CPU 温度?
谢谢!
如果我们只是安装/opt/vc
在容器内......
docker run -it --rm -v /opt/vc:/opt/vc debian:stretch /opt/vc/bin/vcgencmd measure_temp
Run Code Online (Sandbox Code Playgroud)
...它失败了:
/opt/vc/bin/vcgencmd: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我们到哪里去找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)
Run Code Online (Sandbox Code Playgroud)
这表明我们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
Run Code Online (Sandbox Code Playgroud)
失败的原因是:
VCHI initialization failed
Run Code Online (Sandbox Code Playgroud)
太棒了,我们已经解决了缺少库的问题!我怀疑vcgencmd
正在寻找容器中不可用的设备。vcgencmd
我们可以通过在以下主机的控制下运行来弄清楚这是什么strace
:
strace -o /tmp/trace -f -s 80 /opt/vc/bin/vcgencmd measure_temp
Run Code Online (Sandbox Code Playgroud)
/dev
现在我们在 中查找/tmp/trace
,我们发现:
6868 openat(AT_FDCWD, "/dev/vchiq", O_RDWR|O_LARGEFILE) = 3
Run Code Online (Sandbox Code Playgroud)
所以我们需要暴露/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
Run Code Online (Sandbox Code Playgroud)
现在报告:
temp=69.3'C
Run Code Online (Sandbox Code Playgroud)
我们已经成功vcgencmd
在容器内运行。