我正在尝试将基于 Linux 的服务器上运行的容器移至 AWS。我正在执行提交-保存-加载。
执行提交-保存-加载后,将创建一个 docker 镜像。然后我使用命令运行此 docker 镜像
docker run <image_name>
但我收到以下错误
请求的图像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配,并且未请求特定平台
standard_init_linux.go:228:exec 用户进程导致:exec 格式错误
我尝试使用以下方式运行 docker 镜像
docker run --platform linux/amd64 <image_name>
即使这样也没有解决问题。得到了同样的错误
答案1
您不能在 ARM 平台上运行 amd64 映像(更准确地说,是映像的相同摘要),即使它所基于的映像具有多平台功能。
换句话说,它不适用于提交/保存/加载过程。
映像本身通常需要docker buildx build --platform linux/arm64/v8,linux/amd64,...
基于每个目标平台的 Dockerfile 进行构建()。
如果你没有 Dockerfile(坏习惯),你可以尝试使用docker history
和/或从镜像中逆向工程 Dockerfile(到一定级别)。https://github.com/mrhavens/Dedockify
尽管 buildx 是正确的方法,但为了简单起见,docker build
如果您只想快速运行一次,您可以直接在 aws ARM 机器上通过 legacy-build() 来构建镜像
(仍然需要 Dockerfile – 无法将图像转换到另一个平台)
答案2
如果您安装库姆在 AWS Arm 机器上,您可以运行 x86_64 映像,但这将在模拟 CPU 上运行,这将对性能产生很大的开销。
假设主机基于 Debian/Ubuntu
sudo apt-get install qemu binfmt-support qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run --platform linux/amd64 <image_name>
第一个命令安装模拟层,第二个命令告诉内核在哪里找到运行容器的模拟器,每次重新启动主机时都需要执行第二步。
正如这里以及您的其他问题所述正确的要做的事情是使用 Dockerfile 来构建容器,这样你就可以用一种可重复的方式来构建你需要的任何架构的容器(你也可以使用我上面提到的步骤在你的 X86_64 机器上为 Arm64 构建映像,如下所述这里)