这一段完整的报错是:

The requested image’s platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested

翻译过来就是说:请求的映像的平台(linux/arm64/v8)与检测到的主机平台(linux/amd64)不匹配,未请求特定平台。

背景:

这段报错是发生在内网,物理机Ubuntu 20.04 x86 架构下运行docker容器,恰好这个docker容器是我打包到私有仓库的基于arm64/v8架构的ubuntu环境下运行的turn服务器。于是就发生了在 x86 架构下 的物理机Ubuntu运行基于arm64/v8架构的ubuntu软件服务,于是docker报错,容器运行失败。

Mac下解决方案:

如果是Mac苹果电脑,并且在Docker上运行某个应用,则可以尝试如下解决方式。

启动命令加入 --platform linux/amd64 即可。

示例:

docker run -it --platform linux/amd64 --name dgraph dgraph/standalone:v21.03.0

按照这个说法。我在本地Mac上也成功运行了该容器。实际上是,我在Mac上成功分别运行了arm64/v8 架构的Ubuntu软件服务、和amd64架构的Ubuntu软件服务。我也理所应当的认为docker可以在任务环境下运行镜像容器。然而事实是这个报错打醒了我。

刨根问底

Q:amd64 和arm64v8 有什么区别?
A:amd64 和 arm64v8 都是用于描述计算机系统体系结构的指令集架构。它们之间的主要区别在于,amd64 是一种用于基于 x86 架构的计算机的指令集,而 arm64v8 则是一种用于基于 ARM 架构的计算机的指令集。


Q:docker 上面Ubuntu镜像中的amd64 和arm64v8 有什么区别?
A:Docker 是一个用于简化应用程序的部署、测试和维护的开源容器管理平台。在 Docker 上运行的 Ubuntu 镜像(或镜像的版本)中的 amd64 和 arm64v8 区别主要在于它们适用于不同的架构类型。具体来说,amd64 镜像可以在基于 x86 架构的计算机上运行,而 arm64v8 镜像则可以在基于 ARM 架构的计算机上运行。


Q:x86架构的计算机可以运行arm64v8的镜像吗?
A:通常来说,基于 x86 架构的计算机是不能运行 arm64v8 镜像的。这是因为 x86 架构和 ARM 架构有着不同的指令集,所以他们所能运行的镜像也是不同的。


Q:docker镜像构建的容器不是可以在任何操作系统运行吗?
A:是的,Docker 镜像构建的容器是可以在大多数操作系统上运行的。Docker 容器的一个重要特性是它们是轻量级且可移植的,因此可以在多种不同的操作系统中运行。不过,需要注意的是,Docker 容器的架构类型必须与宿主操作系统的架构类型相匹配。例如,如果宿主操作系统是基于 x86 架构的,那么 Docker 容器也必须是基于 x86 架构的。


Q:那为什么iMac操作系统既可以运行arm64v8的镜像 ,又可以运行amd64的镜像?
A:iMac 操作系统可以运行 arm64v8 和 amd64 镜像是因为它是基于苹果公司的自家处理器架构,称为苹果公司架构(Apple Silicon)。苹果公司架构支持两种指令集:arm64 和 x86-64,因此 iMac 操作系统可以运行基于这两种指令集的镜像。不过,iMac 操作系统也可以通过使用虚拟机或者其他方式来运行其他架构的操作系统,从而能够运行其他架构的 Docker 镜像。


解决方案

重新拉去docker镜像,在Ubuntu x86 架构下运行amd64 镜像 下docker容器。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐