使用多阶段Java构建时,使用Docker buildx构建arm64镜像时会出现挂起的情况

3
我正在尝试为使用多阶段构建的Spring Boot应用程序构建一个arm64 Docker镜像。使用buildx或者qemu在使用jar -xf ../*.jar进行解包时会挂起。其中一个CPU核心使用100%,进程无限运行。同时,buildx可以成功地为我的非Java项目构建arm64镜像。这可能是由于buildx、qemu、jar、我的应用程序或这些任意组合中的某些原因。请分享如何调试此问题的想法?
.Dockerfile
FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/app
COPY build/libs/*.jar .
RUN mkdir -p unpacked && (cd unpacked; jar -xf ../*.jar) # <-- this is where qemu hangs

# Multi-stage build to split the dependencies and the app code into different layers
FROM openjdk:8-jdk-alpine
...etc ... these stage is not reached at all

建立镜像的命令: docker buildx build --platform linux/arm64,linux/amd64 -t mytag . --push 标准输出中这行代码会无限地执行:
[linux/arm64 build 4/4] RUN mkdir -p unpacked && (cd unpacked; jar -xf ../*.jar)

我看到进程正在运行:

ps aux | grep jar
root       21965 99.9  0.0 201144 12928 ?        Ssl  23:10  39:06 /usr/bin/qemu-aarch64 /usr/lib/jvm/java-1.8-openjdk/bin/jar -xf ../myjar-0.0.1-SNAPSHOT.jar

你可以尝试使用完整的 openjdk:8-jdk 镜像吗? - Noam Yizraeli
1
谢谢Noam。它在完整的图像中运行。如果您将其添加为答案,我会接受它。如果您知道为什么它在alpine版本中无法工作,那将是很好分享的。 - Peter
我认为这很可能是因为大多数Linux发行版使用通用的c库,而alpine使用musl(之前曾导致错误)。如果可能的话,我希望您也尝试一下“openjdk:8-jdk-slim”版本,并检查是否可以获取一些日志或生成过程,以便提供更完整和全面的解决方案。 - Noam Yizraeli
它也可以与 slim 版本一起工作。图像大小几乎比完整基础图像小了两倍。谢谢!我想我会选择使用 slim 版本而不是 alpine - Peter
很高兴能够帮助,创建了合适的答案并会在更改和改进方面进行更新。 - Noam Yizraeli
1个回答

3

很难确定,但可能是许多版本化的alpine Docker镜像中存在的问题之一,这里有一个类似的Python问题报告,因此可能是相同的问题。

目前建议的解决方案是,如果大小过大,则使用Debian版本的精简版(openjdk:8-jdk-slim)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接