睡前讲一段docker编译镜像的故事

张开发
2026/4/3 17:48:28 15 分钟阅读
睡前讲一段docker编译镜像的故事
最近在和团队的工程师开发一些创新项目我需要把本地项目打包成docker镜像并且推送得到AWS云服务上的镜像仓库ECR。我写好Dockerfile之后就开始先编译然后再推送。命令如下所示docker build -t ai-service:latest . docker tag ai-service:latest XXXXX.dkr.ecr.us-east-1.amazonaws.com/ai-service:latest docker push XXXXX.dkr.ecr.us-east-1.amazonaws.com/ai-service:latest一切看似顺利但当我使用这个容器镜像来创建EC2我选择了t3.micro的时候却遇到了镜像和系统平台不兼容的报错具体如下所示latest: Pulling from smart-inventory no matching manifest for linux/amd64 in the manifest list entries可以看出EC2的系统是linux/amd64的而我的笔记本电脑是MacOS M1芯片是arm64的架构。Docker默认编译出来的镜像是基于所在平台的也就是说用MacOS M1编译出的镜像也是arm架构。解决这个问题十分简单Docker提供了强大的buildx工具可以在编译的时候指定编译出的架构。例如我想编译出适合linxu/amd64的镜像可以用如下命令docker buildx build --platform linux/amd64 -t ai-service:latest .这样编译出来的镜像就能在linux/amd64架构的机器上运行了。仔细再想一想为什么之前我没有遇到这个问题呢原因是因为我并不是直接在我本地电脑上编译镜像并推送到远端镜像库的我们通常是通过持续集成系统CI/CD来完成的。在CI/CD流程中我们使用的是amd64架构的虚拟机来完成镜像编译这样编译出的镜像都是amd64的。所以如果我要坚持在本地编译镜像来推送则需要先判断当前系统是否是MacOS如果是则使用“--platform linux/amd64”参数完成编译即可用Python实现如下所示if os.name posix and darwin in os.uname().sysname.lower(): # On macOS, build for linux/amd64 platform build_cmd [docker, buildx, build, --platform, linux/amd64, -t, image_name, .] else: build_cmd [docker, build, -t, image_name, .]

更多文章