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

How to build a Docker container that starts a .jar and runs on a RaspberryPi 4B?

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

这是我最基本的Docker文件:

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

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

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 onty 这个 machine(最好以一种相当简单、方便的方式,但如果那样做'存在,我很乐意以艰难的方式做到这一点,这可能需要什么)?

顺便说一句:这就是 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

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

看看 this 是否有帮助。

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

然而,

Raspberry PI 使用 ARM 架构,因此输出 ARMv7 Processor rev 3 (v7l).

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

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