M1设备Docker拉取错误架构镜像问题求助
我基于rabbitmq:3.11.7-management镜像制作自定义镜像,本应支持ARM架构,但在MacBook Pro M1 Max上运行时出现错误qemu: uncaught target signal 11 (Segmentation fault) - core dumped,排查后发现是镜像未针对linux/arm64架构编译。
我已经用buildx在Docker Hub的沙箱仓库构建了支持linux/arm64和linux/amd64的多架构镜像,看起来没问题,但用docker-compose运行时还是报错,docker-compose配置如下:
my-service: image: my-docker-hub/my-image:latest restart: unless-stopped ports: - ... omitted for simplicity
用docker image inspect查看本地镜像,发现只有amd64架构:
... omitted for simplicity "Architecture": "amd64", "Os": "linux", ... omitted for simplicity
我想让Docker自动拉取对应架构的镜像,不想修改docker-compose(因为要给其他开发者用,还要部署在amd服务器上),怎么实现开箱即用的架构适配?
补充:执行docker buildx imagetools inspect johnczek/sandbox:latest的结果如下:
Name: docker.io/johnczek/sandbox:latest MediaType:
application/vnd.oci.image.index.v1+json Digest:
sha256:3a9513161f3d9ca3a20da37b921fb682fd3481710b9457d84c67bc0907e3864cManifests: Name:
docker.io/johnczek/sandbox:latest@sha256:cdd7729d9b4aa3550edc1d15d6b74dd26f1cf56cfc5c798f578a6bce58682569
MediaType: application/vnd.oci.image.manifest.v1+json Platform:
linux/amd64Name:
docker.io/johnczek/sandbox:latest@sha256:4738d2c8d60fe306fffe76b83d33414442c4d49ad4d0777f3c8f58bb16ebdeb8
MediaType: application/vnd.oci.image.manifest.v1+json Platform:
linux/arm64Name:
docker.io/johnczek/sandbox:latest@sha256:ba4101895734fe3c7285066f351cd65264d0f70f3e305a7f7edbd3a122c99a83
MediaType: application/vnd.oci.image.manifest.v1+json Platform:
unknown/unknown Annotations:
vnd.docker.reference.digest: sha256:cdd7729d9b4aa3550edc1d15d6b74dd26f1cf56cfc5c798f578a6bce58682569
vnd.docker.reference.type: attestation-manifestName:
docker.io/johnczek/sandbox:latest@sha256:091f9094c09e6bbbed985f8eceb9912e94eb3758e22fe582a76d26f84ec61e50
MediaType: application/vnd.oci.image.manifest.v1+json Platform:
unknown/unknown Annotations:
vnd.docker.reference.digest: sha256:4738d2c8d60fe306fffe76b83d33414442c4d49ad4d0777f3c8f58bb16ebdeb8
vnd.docker.reference.type: attestation-manifest
1. 清理本地缓存镜像
Docker可能已缓存了amd64版本的镜像,先删除本地镜像:
docker rmi my-docker-hub/my-image:latest
2. 确认Docker多架构支持状态
在M1 Mac上,Docker Desktop默认支持多架构识别,可检查:
- 打开Docker Desktop设置 -> Features in development -> 确认
Use Rosetta for x86/amd64 emulation on Apple Silicon已勾选(此选项用于模拟x86,不影响原生arm64镜像的拉取,但确保Docker架构识别功能正常)
3. 重新拉取镜像
执行拉取命令,让Docker自动匹配本地架构:
docker pull my-docker-hub/my-image:latest
拉取完成后用docker image inspect验证,应显示对应架构信息。
4. 重新推送多架构镜像清单
从imagetools inspect结果看,多架构清单已存在,但可能推送过程有异常。重新构建并推送:
docker buildx build --platform linux/amd64,linux/arm64 -t my-docker-hub/my-image:latest --push .
确保添加--push参数,将多架构清单同步到Docker Hub。
5. 强制指定架构拉取(可选)
若自动匹配仍失败,可临时指定架构拉取:
docker pull --platform linux/arm64 my-docker-hub/my-image:latest
或设置全局环境变量(仅当前终端有效):
export DOCKER_DEFAULT_PLATFORM=linux/arm64
此方法需开发者手动执行,可写入项目文档说明。
6. 升级docker-compose版本
旧版docker-compose可能存在架构识别缺陷,升级到最新版本:
docker-compose --version
升级后重新运行服务。
内容的提问来源于stack exchange,提问作者Johnczek

