很多人都运行过容器,但是容器的启动过程到底是怎样的,可能很多人并没有太在意。这里我们先了解一下容器的启动过程,假设键入命令 docker run -i -t ubuntu /bin/bash
首先系统要有一个docker daemon的后台进程在运行,当命令敲下时,
1.docker client(即:docker终端命令行)会调用docker daemon请求启动一个容器,
2.docker daemon会向host os(即:Linux)请求创建容器
3.Linux会创建一个空的容器(可以简单理解为:一个未安装操作系统的裸机,只有虚拟出来的CPU、内存等硬件资源)
4.docker daemon检查本机是否存在docker镜像文件(可以简单理解为操作系统安装光盘),如果有,则加载到容器中(即:光盘插入裸机,准备安装操作系统)。如果发现文件不存在,则会到默认的docker镜像注册机构(即:docker hub网站)去联网下载,下载回来后,再进行装载到容器的动作。
5.将镜像文件加载到容器中(即:裸机上安装好了操作系统,不再是裸机状态)
最后,我们就得到了一个ubuntu的容器,然后就可以进行各种操作了。
那么,在最后一步加载镜像文件时,有时会提示”Exec Format Error ”。
以K1 Power Linux (ppc64le) 运行容器为例,从GitHub上下载 docker-ce 的源码,经过查找,发现 “exec format error”错误定义在文件
docker-ce-19.03.14/components/engine/vendor/golang.org/x/sys/unix/ zerrors_linux_ppc64le.go
中:
{8, "ENOEXEC", "exec format error"}
而错误码 “ENOEXEC”是Linux 内核定义的错误,定义在文件
/usr/include/asm/errno.h 中:
#define ENOEXEC 8 / Exec format error /
这个错误码的本意是 “It's from trying to execute a file that has a magic number that the kernel doesn't know how to handle.” “magic number”即“幻数”,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
发生 “exec format error”表示Linux内核无法理解你要执行的这个文件到底是个什么东西,常见的原因包括:
ü CPU位数不兼容,例如在一个64位的系统上,执行一个32位的文件。
ü 操作系统不兼容,例如在Linux系统上,执行一个Windows系统下生成的文件。
ü CPU架构不兼容,例如在 PPC64LE 即Power CPU上,执行一个 x86 架构下的文件;
反之亦然。
以经验看,当在做不同架构迁移时,最容易犯的错误,就是将x86的容器镜像文件,直接在Power(PPC64LE)平台上运行。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论