0

I try to run Pi4J Library inside a docker container on RaspberryPi Host. When the app is running on RaspberryPi Host, everything is working fine. But when its run inside a docker container, the Pi4J native library cant be loaded.

pom

    <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"]

When i run the app without setting the pi4j.library.path im getting this error.

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 folder has permission 777

When im setting the pi4j.library.path and add the volume to the docker container.

Caused by: java.lang.UnsatisfiedLinkError: /app/data/pi4j/libpi4j-pigpio.so: libpigpio.so.1: 
 cannot open shared object file: No such file or directory

If anyone got experience with Pi4j and Docker, please help me - THANKS :)

UPDATE 1 - 2022-09-01

Problem seems to be, that java cant load native libraries inside the docker container with System.load() function.

Host

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

inside Docker

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)

UPDATE 2 - 2022-09-01

The Problem is quite easy, the library libpigpio.so.1 is missing inside the container. Currently i do not know how to install it. For now my workaround/solution is to mount the missing lib to the docker. container.

    volumes:
      - type: bind
        source: /lib/libpigpio.so.1
        target: /lib/libpigpio.so.1
        read_only: true
wutoso
  • 46
  • 5
  • Sorry, no experience myself (yet) with Pi4J in a Docker, but would love to know if this question gets solved! Would be a great addition for pi4j.com documentation... Maybe also a topic to discuss on https://github.com/Pi4J/pi4j-v2/discussions – Frank Sep 01 '22 at 11:51
  • 1
    Ive got it working. See Update 2. But actually i think its just a workaround. – wutoso Sep 01 '22 at 12:20
  • great! seems a nice solution... very curious to understand the use-case for a Docker, but that's maybe not something to discuss here – Frank Sep 02 '22 at 06:25

0 Answers0