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

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份[《Java开发全套学习资料》]送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>