You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

M1 Pro设备Docker Compose运行异常排查与技术疑问

问题背景与解决过程

初始情况

团队全员使用16英寸Apple M1 Pro(64GB内存)笔记本,Docker与M1芯片兼容性存在已知问题。团队共用一套Docker Compose配置,我启动服务时遇到报错:

no matching manifest for linux/arm64/v8 in the manifest list entries 

安装与配置流程

我按以下步骤安装配置Docker:

$ brew install --cask docker
$ softwareupdate --install-rosetta

之后在Docker设置中做了如下调整:

  • 设置 -> 通用 -> 使用虚拟化框架
  • 设置 -> 开发中功能 -> 使用Rosetta进行x86/amd64仿真

但执行启动命令后仍报错:

$ docker compose up -d
no matching manifest for linux/arm64/v8 in the manifest list entries

排查过程

通过逐个注释服务测试,发现问题出在Debezium服务:

debezium:
    image: debezium/connect:2.2
    container_name: debezium-myapp
    # platform: linux/amd64
    ...

默认配置中platform: linux/amd64处于注释状态,取消注释后问题解决,所有服务正常运行。


技术问题解答

1. platform: linux/amd64的具体作用

这个配置是明确告诉Docker,要拉取x86_64(amd64)架构的镜像文件,而非当前M1芯片对应的arm64架构镜像。因为Debezium connect 2.2版本的镜像未提供arm64版本,Docker默认尝试拉取与主机匹配的arm64镜像时找不到对应资源,因此报错。指定平台后,Docker会拉取amd64镜像,再通过之前开启的Rosetta 2进行x86/amd64仿真运行,解决镜像缺失问题。

2. 仅个人遇到问题的原因及无需添加配置的解决方法

原因

团队成员虽使用相同型号电脑,但本地Docker配置可能存在差异:

  • 其他成员的Docker已全局设置默认平台为linux/amd64
  • 他们的Docker版本更新更及时,架构自动适配逻辑更完善
  • 可能之前已拉取过amd64版本的Debezium镜像,Docker优先使用本地缓存

无需添加配置的解决方法

  • 全局设置默认平台:打开Docker设置 -> Docker Engine,在配置文件中添加"default-platform": "linux/amd64",保存后重启Docker,所有服务默认拉取amd64镜像
  • 手动拉取amd64镜像:先执行docker pull debezium/connect:2.2 --platform linux/amd64,拉取完成后再启动Compose,Docker会优先使用本地已有的amd64镜像
  • 更新Docker版本:升级到最新版Docker,新版本对M1芯片的架构适配逻辑更成熟,可能自动尝试拉取兼容的amd64镜像并启用Rosetta仿真

3. 对其他平台用户的影响

  • Intel Mac用户:本身为x86架构,该配置无任何影响,Docker直接拉取匹配的amd64镜像正常运行
  • Windows/Linux(x86架构)用户:与Intel Mac一致,完全兼容,服务正常启动
  • arm架构的Windows/Linux用户:会强制拉取amd64镜像,通过系统自带仿真层运行,可能有轻微性能损耗;若这类用户需要arm原生镜像,只需注释掉该配置即可。若团队中无此类用户,该配置不会带来负面影响

完整Docker Compose配置
version: '3.9'
services:

  postgres:
    image: debezium/postgres:14-alpine
    container_name: postgres-my-app
    restart: on-failure
    networks:
      - my-app-network
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=password
    ports:
      - 5432:5432
    volumes:
      - pg_volume_my_app:/var/lib/postgresql/data
  
  zookeeper:
    container_name: zookeper-myapp
    image: confluentinc/cp-zookeeper:7.3.2
    networks:
      - my-app-network
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_SERVERS: zookeper:2888:3888
    ports:
      - 2181:2181
  
  kafka:
    container_name: kafka-myapp
    image: confluentinc/cp-enterprise-kafka:7.3.2
    networks:
      - my-app-network
    depends_on: [ zookeeper ]
    environment:
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka:19092,LISTENER_DOCKER_EXTERNAL://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_JMX_PORT: 9999
      KAFKA_JMX_HOSTNAME: 172.17.0.1
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
    ports:
      - "9092:9092"
      - "9999:9999"
    expose:
      - "19092"
  
  debezium:
    image: debezium/connect:2.2
    container_name: debezium-myapp
    platform: linux/amd64
    networks:
      - my-app-network
    environment:
      BOOTSTRAP_SERVERS: kafka:19092
      GROUP_ID: 1
      CONFIG_STORAGE_TOPIC: connect_configs
      OFFSET_STORAGE_TOPIC: connect_offsets
      CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081
      CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081
    depends_on: [ kafka ]
    ports:
      - 8083:8083
    volumes:
      - debezium_volume_myapp:/var/lib/debezium/data

  schema-registry:
    image: confluentinc/cp-schema-registry:7.3.2
    container_name: schema-registry-myapp
    networks:
      - my-app-network
    environment:
      - SCHEMA_REGISTRY_HOST_NAME=schema-registry
      - SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS=PLAINTEXT://kafka:19092
      - SCHEMA_REGISTRY_LISTENERS=http://schema-registry:8081,http://localhost:8081
    ports:
      - 9191:8081
    depends_on: [ kafka ]

volumes:
  pg_volume_my_app:
    driver: local
  debezium_volume_myapp:
    driver: local
networks:
  my-app-network:
    name: my-app-network

内容的提问来源于stack exchange,提问作者Kalec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:00:06