树莓派Docker容器中运行Pi4J时本地库加载失败求助
在Docker容器中运行Pi4J应用时本地库加载失败问题
问题概述
- 树莓派主机上直接运行Pi4J应用一切正常,但在Docker容器内运行时,Pi4J本地库无法加载。
相关配置
pom.xml配置
<properties> <!-- DEPENDENCIES VERSIONS --> <pi4j.version>2.1.1</pi4j.version> </properties> <dependencies> <!-- include Pi4J Core --> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-core</artifactId> <version>${pi4j.version}</version> </dependency> <!-- include Pi4J Plugins (Platforms and I/O Providers) --> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-plugin-raspberrypi</artifactId> <version>${pi4j.version}</version> </dependency> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-plugin-pigpio</artifactId> <version>${pi4j.version}</version> </dependency> </dependencies>
Dockerfile内容
FROM eclipse-temurin:17-jdk as builder ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM eclipse-temurin:17-jre-focal COPY --from=builder dependencies/ ./ COPY --from=builder snapshot-dependencies/ ./ COPY --from=builder spring-boot-loader/ ./ COPY --from=builder application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
错误信息
未设置pi4j.library.path时的错误
java.lang.UnsatisfiedLinkError: /tmp/libpi4j-pigpio3285308132227026624.so: libpigpio.so.1: cannot open shared object file: No such file or directory ... Caused by: java.lang.UnsatisfiedLinkError: Pi4J was unable to extract and load the native library [/lib/aarch64/libpi4j-pigpio.so] from the embedded resources inside this JAR [/application/BOOT-INF/lib/pi4j-library-pigpio-2.1.1.jar]. to a temporary location on this system. You can alternatively define the 'pi4j.library.path' system property to override this behavior and specify the library path.
注:容器内/tmp文件夹权限为777
设置pi4j.library.path并添加容器卷后仍报错
Caused by: java.lang.UnsatisfiedLinkError: /app/data/pi4j/libpi4j-pigpio.so: libpigpio.so.1: cannot open shared object file: No such file or directory
问题排查更新
更新1(2022-09-01)
对比主机与容器内ldd命令输出,确认容器中缺失libpigpio.so.1库:
- 主机端
ldd libpi4j-pigpio.so输出:
ldd libpi4j-pigpio.so linux-vdso.so.1 (0x0000007f8460d000) libpigpio.so.1 => /lib/libpigpio.so.1 (0x0000007f844ca000) libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007f84358000) /lib/ld-linux-aarch64.so.1 (0x0000007f845df000) libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007f843
- 容器内
ldd libpi4j-pigpio.so输出:
ldd libpi4j-pigpio.so linux-vdso.so.1 (0x0000007fb06ac000) libpigpio.so.1 => not found libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007fb04f0000) /lib/ld-linux-aarch64.so.1 (0x0000007fb067c000)
更新2(2022-09-01)
已确认问题核心是容器内缺少libpigpio.so.1库,目前临时解决方案是将主机的该库挂载到容器:
volumes: - type: bind source: /lib/libpigpio.so.1 target: /lib/libpigpio.so.1 read_only: true
求助
寻求有Pi4J与Docker使用经验的开发者提供更完善的解决方案,谢谢!
内容的提问来源于stack exchange,提问作者wutoso
相关产品推荐
相关产品推荐

