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

最近在和团队的工程师开发一些创新项目,我需要把本地项目打包成docker镜像,并且推送得到AWS云服务上的镜像仓库(ECR)。

我写好Dockerfile之后就开始先编译,然后再推送。命令如下所示:

bash 复制代码
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)的时候,却遇到了镜像和系统平台不兼容的报错,具体如下所示:

bash 复制代码
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的镜像,可以用如下命令:

bash 复制代码
docker buildx build --platform linux/amd64 -t ai-service:latest .

这样编译出来的镜像就能在linux/amd64架构的机器上运行了。

仔细再想一想,为什么之前我没有遇到这个问题呢?

原因是因为我并不是直接在我本地电脑上编译镜像并推送到远端镜像库的,我们通常是通过持续集成系统(CI/CD)来完成的。在CI/CD流程中,我们使用的是amd64架构的虚拟机来完成镜像编译,这样编译出的镜像都是amd64的。

所以如果我要坚持在本地编译镜像来推送,则需要先判断当前系统是否是MacOS,如果是,则使用"--platform linux/amd64"参数完成编译即可,用Python实现如下所示:

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, "."]

每次遇到问题,我总是想多思考一下背后的原因,有点像挖金矿一样,收获蛮大。

王阳明说:人须在事上磨,方立得住,方能静亦定,动亦定。

我还需要继续磨励,继续专研,把事儿做好。走好脚下路的,才能有好未来。

相关推荐
运维行者_9 小时前
深入解析 Docker 监控:核心指标完整清单
运维·服务器·网络·数据库·docker·容器·eureka
礼拜天没时间.9 小时前
容器网络配置——从互联到自定义桥接
运维·网络·docker·容器·centos
中草药z11 小时前
【Linux】拆解 Linux 容器化核心:Namespace 隔离 + cgroups 资源控制,附 LXC 容器生命周期实战
运维·docker·容器·虚拟化·namespace·lxc·cgroups
猫头虎11 小时前
【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版
docker·npm·开源·aigc·ai编程·远程工作·openclaw
feasibility.11 小时前
基于Qwen3-VL多模态嵌入/重排序模型+Dify(docker)工作流的电商图文检索系统
人工智能·docker·多模态·教育电商·dify·rag·智能体/工作流
liu****12 小时前
4.镜像仓库详解
c++·docker·云原生·容器·kubernetes·镜像\
程序员阿明12 小时前
docker 搭建iotdb集群2版本的
docker·容器·iotdb
likeGhee13 小时前
bridge 模式下docker容器无法访问,curl: (56) Recv failure: Connection reset by peer
运维·docker·容器
予枫的编程笔记13 小时前
【Docker基础篇】实用CLI命令指南:run/stop/exec/logs,日常开发高频使用不踩坑
docker·命令行工具·开发效率·cli命令·服务生命周期管理·cli调试·程序员必备