我们可以在任何地方从 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 容器中构建本机图像文件并 运行 它。
我们是 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 容器中构建本机图像文件并 运行 它。