如何构建运行多个体系结构的本机映像Docker映像?

7rtdyuoh  于 2023-01-08  发布在  Docker
关注(0)|答案(1)|浏览(169)

我想创建一个多架构Docker映像,其中包含Micronaut应用程序的本机映像二进制文件。
运行./gradlew dockerfileNative时,Micronaut使用多阶段构建生成Dockerfile,以创建Micronaut应用程序的本机映像。

FROM ghcr.io/graalvm/native-image:ol7-java17-22.2.0 AS graalvm
WORKDIR /home/app
COPY layers/libs /home/app/libs
COPY layers/classes /home/app/classes
COPY layers/resources /home/app/resources
COPY layers/application.jar /home/app/application.jar
RUN mkdir /home/app/config-dirs
COPY config-dirs/generateResourcesConfigFile /home/app/config-dirs/generateResourcesConfigFile
RUN native-image -cp /home/app/libs/*.jar:/home/app/resources:/home/app/application.jar --no-fallback -H:Name=application -J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.configure=ALL-UNNAMED -J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk=ALL-UNNAMED -J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jni=ALL-UNNAMED -J--add-exports=org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED -H:ConfigurationFileDirectories=/home/app/config-dirs/generateResourcesConfigFile -H:Class=ch.onstructive.salessystem.Application
FROM frolvlad/alpine-glibc:alpine-3.12
RUN apk --no-cache update && apk add libstdc++
EXPOSE 8080
HEALTHCHECK CMD curl -s localhost:8080/endpoints/health | grep '"status":"UP"'
COPY --from=graalvm /home/app/application /app/application
ENTRYPOINT ["/app/application"]

Micronaut使用ghcr.io/graalvm/native-image:ol7-java17-22.2.0作为多阶段构建的基础映像,检查我的MacBook M1上的基础映像,我发现基础映像支持arm64架构。

❯ docker image inspect --format "{{.RepoTags}} {{.Architecture}}" ghcr.io/graalvm/native-image:ol7-java17-22.2.0
[ghcr.io/graalvm/native-image:ol7-java17-22.2.0] arm64

在第二阶段,Micronaut使用frolvlad/alpine-glibc:alpine-3.12并将原生映像二进制文件复制到其中。这个Docker映像的问题是,它只支持amd64,因此无法在Mac M1或其他基于arm64的系统上运行。

❯ docker image inspect --format "{{.RepoTags}} {{.Architecture}}" frolvlad/alpine-glibc:alpine-3.12             
[frolvlad/alpine-glibc:alpine-3.12] amd64

是否有一个替代的Docker映像,它同时支持arm64(又名aarch64)和amd64

ycl3bljg

ycl3bljg1#

我在Micronaut Gradle插件文档中偶然发现了Docker图像

tasks.named('dockerfileNative') {
    baseImage('gcr.io/distroless/cc-debian10')
}

此映像适用于arm64amd64

相关问题