Docker 在 M1 Mac arm64架构上构建 amd64镜像。

问题描述:通过在Mac M1电脑上构建的镜像,在linux x86的服务器上运行不起来,因为编译原理不一样。

构建好的镜像ID,通过docker inspect命令可以查看镜像的架构;

如下,同样的服务,构建出来的镜像架构确实不一样的。

[root@one-01 ~]# docker inspect 150b12879d3b | grep Architecture
        "Architecture": "arm64",
[root@one-01 ~]# 
[root@one-01 ~]# docker inspect 3ca177c70621 | grep Architecture
        "Architecture": "amd64",
[root@one-01 ~]# 

构建arm64使用的Dockerdile

FROM openjdk:8
RUN apt install tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ARG NAME
ARG FILE_URL

ENV APP_NAME=${NAME}
ENV PROFILE=ca
ENV PORT=8080

ADD ${FILE_URL} app.jar


ENTRYPOINT java -jar -Dspring.profiles.active=${PROFILE} -Dserver.port=${PORT} -Duser.timezone=Asia/Shanghai /app.jar

构建amd64使用的镜像

FROM anapsix/alpine-java:8_server-jre_unlimited

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime


ARG NAME
ARG FILE_URL

ENV APP_NAME=${NAME}
ENV PROFILE=caiicloud
ENV PORT=8080

ADD ${FILE_URL} app.jar

ENTRYPOINT java -jar -Dspring.profiles.active=${PROFILE} -Dserver.port=${PORT} -Duser.timezone=Asia/Shanghai /app.jar

分析一下可能是因为Dockerfile.

如果你也是Java镜像可以按照我的方式替换一下源镜像文件,如果是其他镜像,可以找一下适配amd64的源镜像文件。

我重新使用amd64的dockerfile构建了一下,查看到一个warning

---> [Warning] The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

意思就是,请求的镜像是amd64的,在arm64上面构建不适配,但也是可以构建成功的。

运行的时候需要加一个--platform linux/amd64参数

下面是Docker官网的解释

另外Docker通过buildx. 集成了Moby BuildKit工具包的 CLI 插件。这允许您为各种不同的 CPU 架构构建 Docker 映像,并且它在后台使用 QEMU 进行仿真。

可以通过命令查看支持的编译类型

docker buildx ls

 

相关链接推荐:How to build x86 (and others!) Docker images on an M1 Mac – Jaimyn's Blog

你可能感兴趣的:(云原生记录系列,java,arm,架构,云原生)