问题描述:通过在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:8RUN apt install tzdata && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeARG NAMEARG FILE_URLENV APP_NAME=${NAME}ENV PROFILE=caENV PORT=8080ADD ${FILE_URL} app.jarENTRYPOINT java -jar -Dspring.profiles.active=${PROFILE} -Dserver.port=${PORT} -Duser.timezone=Asia/Shanghai /app.jar

构建amd64使用的镜像

FROM anapsix/alpine-java:8_server-jre_unlimitedRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeARG NAMEARG FILE_URLENV APP_NAME=${NAME}ENV PROFILE=caiicloudENV PORT=8080ADD ${FILE_URL} app.jarENTRYPOINT 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