Docker 使用多阶段构建 arm64 镜像时 buildx 挂起 Java

Docker buildx hangs when building image for arm64 using multi-stage Java build

我正在尝试为使用多阶段构建的 Spring 引导应用构建 arm64 Docker 映像。 buildx 或更确切地说 qemu 在使用 jar -xf ../*.jar 的解包步骤中挂起。 CPU 个核心之一使用 100%,进程无限运行。同时buildx可以为我的非Java项目成功构建arm64镜像。这可能是由于 buildx、qemu、jar、我的应用程序或这些的任何组合中的某些原因。请分享如何调试这个的想法?

.Docker文件

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

很难说,但这可能是 alpine 版本 docker 图像可能存在的众多问题之一,here's python 也报告了类似的问题,因此它可能一样。

暂时推荐的方案是,如果体积比较笨重的话,使用debian版本的slim版本(openjdk:8-jdk-slim)