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
相关产品推荐
相关产品推荐

