我们可以在任何地方从 graalvm docker 和 运行 内部创建原生图像吗?

Can we create native image from inside a graalvm docker and run it anywhere?

我们是 Graalvm 的新手,正在构建一个简单的 Java 命令行应用程序。 jar 运行 在 jvm 模式下很好(java -jar <file>.jar)。我们还没有在我们的机器上安装 Graalvm,所以我们尝试从 Docker 容器内部创建原生镜像,其中 运行s Graalvm,Docker 文件非常简单:

FROM ghcr.io/graalvm/native-image:ol8-java17

COPY . /home/app
WORKDIR /home/app

RUN ./mvnw clean package
RUN native-image -cp target/appj-1.0.0.jar "org.nqm.Appj"
RUN mv org.nqm.Appj appj
RUN chmod +x appj

docker 镜像构建成功。

然后我们尝试访问容器(docker run --rm --name dkappj -it --entrypoint bash dkappj)来收集原生镜像文件。从 docker 容器内部,我们可以 运行 它与 ./appj 没有任何错误。

但是,当我们将本机图像文件复制到 host 机器并使用 ./appj 运行 时,它会产生错误:

zsh: exec format error: ./appj

所以我的问题是我们可以从 graalvm docker 容器中创建本机映像,然后将其复制并 运行 到任何地方吗?或者我们必须在我们的 host 机器上安装 Graalvm 才能执行原生镜像?因为我以为graalvm native image其实就是机器码(就像用C语言创建的app)

编辑: 当我在 运行 相同 os (ubuntu 20.04) 的新计算机上复制整个代码库时,原始映像 运行 在那个 os 上很好]t机器。

(回答我自己的问题)

Can we create native image from inside a graalvm docker and run it anywhere?

答案是肯定的!

出于某些特定原因,我现在可以在 docker 容器中构建本机图像文件并 运行 它。