我前段时间买了个阿里云,没有留意CPU的架构是ARM的,结果部署系统的时候就发现出问题了,部署在docker里的容器实例根本跑不起来,提示什么执行文件格式错误(“exec format error”)。
究其原因,是用于构建docker容器的实例是for x86架构的。arm与x86是CPU的两个不同体系。简而言之,x86是cisc,复杂指令集,尽量依靠硬件来实现计算机指令;而arm是risc,精简指令集,试图依靠简单指令的组合迭代完成复杂指令,详见拙作[《x86、amd、arm和GPU》]。(https://blog.csdn.net/leftfist/article/details/122488559)。因此在x86开发环境中创建的镜像,并不能用于在arm操作系统中创建docker容器实例。
解决办法是,将我们发布的jar包或网站文件,在arm操作系统中创建镜像,然后用这些镜像来创建docker容器。
比如我有个vue项目,发布出dist,改名为myweb,现在制作一个for arm64的镜像:
sudo docker buildx build --platform linux/arm64 -t myweb:1.0.0 -o type=docker .
buildx应该是docker中的扩展,是一个插件。上述语句中的参数,–platform linux/arm64,这个肯定是顾名思义,非常明显,无须多言;而-o type=docker,是 -output type=docker的缩写,大约意思是输出支持指定操作系统类型的docker镜像。“.“则代表Dockerfile文件在当前目录下。
这样子创建出来的镜像,就可以用于在for arm64架构的linux里创建docker容器了。