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解码把网址获取下来。