如何构建启动 .jar 并在 RaspberryPi 4B 上运行的 Docker 容器?

问题描述

我正在开发一个小应用程序,我想在 RaspBerry Pi(型号 4B、32 位、4GB RAM)上的 docker 容器中运行该应用程序。我目前正在学习 Docker,到目前为止我只在我的开发机器(mac)上构建和运行了一些东西。容器设置和 jar 在那台机器上没有问题。

这是我非常基本的 Dockerfile:

FROM java:8
workdir /
ADD my_jar.jar my_jar.jar
EXPOSE 8080
CMD java -jar my_jar.jar

如您所见,没有太多事情发生。我希望能够在 pi 上 Docker build . -t myDockerImage 然后运行我的容器。根据输出,构建成功,但运行失败并显示错误

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested
standard_init_linux.go:219: exec user process caused: exec format error

我做了一些研究,我能找到的只有使用 OpenJDK 的建议。这样做了,但无法构建,它说:

no matching manifest for linux/arm/v7 in the manifest list entries

我在 Docker Hub 上环顾四周,但似乎没有适合这种架构的 Java 映像。或者我不知道该找什么...?

那么我如何在这台机器上的 docker 容器中获取 Java(最好以一种相当简单、方便的方式,但如果不存在,我很乐意以艰难的方式做到这一点,无论如何可能需要)?

顺便说一句:这就是 lshw 关于 RPi 的说明:

raspBerrypi
    description: ARMv7 Processor rev 3 (v7l)
    product: RaspBerry Pi 4 Model B Rev 1.1
    serial: 10000000b3320840
    width: 32 bits
    capabilities: smp

解决方法

问题在于 JRE 仍然依赖于操作系统,而这取决于平台架构。 Java 的标准 docker 映像很可能会使用基于 amd64/x64 的 Linux 操作系统,并安装了适当的 JDK。

然而,Raspberry PI 使用 ARM 架构,因此输出 <!DOCTYPE html> <html> <head> <title></title> <link rel="stylesheet" type="text/css" href="style.css"> <meta name="viewport" content="width=device-width,initialscale=1"> <div class="links"> <ul> <li class="social-share facebook">Facebook</li> <li class="social-share twitter">Twitter</li> </ul> </div> </head> <body> <div id="container"> <button onclick="clicked()" id="btn">Trykk her for et visdomord</button> </div> <p id="output">Generer et visdomsord ved å trykke på knappen</p> <script src="main.js"></script>

因此您需要一个兼容 ARM 的映像,例如其中之一:https://hub.docker.com/r/arm32v7/adoptopenjdk

我不确定 ARM v7 和 v8 的兼容性如何,所以我建议您坚持使用 v7 映像:)

,

默认情况下,它似乎是为另一个平台构建的。您是否尝试在构建图像时传递 --platform=linux/arm/v7

看看 this 是否有帮助。