M1 Mac Docker中amd64 Ubuntu容器Selenium无头Chrome启动报错咨询
你遇到的问题属于Docker for Mac在M1系列芯片设备上的已知兼容问题:M1芯片为arm64架构,运行amd64架构的容器时依赖qemu动态二进制转译实现兼容,Chrome这类存在大量系统调用、图形渲染相关逻辑的应用,在qemu转译环境下适配度极低,会直接出现段错误、进程崩溃、信号捕获失败等问题,和你配置的启动参数、Chrome与chromedriver的版本匹配度无关。
方案1:使用arm64原生镜像+Chromium替换Chrome(推荐)
arm架构Ubuntu官方源已经提供原生arm64版本的chromium和chromium-driver软件包,不需要转译即可运行,兼容性和性能最优,Dockerfile配置参考如下:
FROM arm64v8/ubuntu:20.04 # 禁用交互式配置 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y \ chromium-browser \ chromium-driver \ python3-pip \ && rm -rf /var/lib/apt/lists/* # 安装对应版本Selenium RUN pip3 install selenium==4.0.0
Chrome启动参数保留你已配置的--no-sandbox、--disable-dev-shm-usage、--disable-gpu,额外添加--headless=new启用新版无头模式,稳定性更高。
方案2:直接使用Selenium官方多架构镜像
如果不想自行维护Chrome和chromedriver的安装配置,可以直接使用Selenium官方提供的多架构适配镜像selenium/standalone-chrome,该镜像同时兼容arm64和amd64架构,在M1设备上会自动拉取原生arm版本,docker-compose配置参考如下:
version: '3.8' services: selenium-chrome: image: selenium/standalone-chrome:95.0 shm_size: 2g ports: - "4444:4444" your-celery-worker: # 此处替换为你原有celery worker的配置 build: . depends_on: - selenium-chrome
业务代码中直接连接http://selenium-chrome:4444的远程Selenium服务调用Chrome即可。
方案3:保留amd64镜像的兼容方案
如果业务必须使用amd64架构的容器,可打开Docker for Mac设置页的「Features in Development」选项卡,勾选「Use Rosetta for x86/64 emulation on Apple Silicon」,使用Rosetta2替代qemu做转译,兼容性远高于qemu,可解决Chrome崩溃问题,性能略低于原生arm镜像。
内容的提问来源于stack exchange,提问作者Jiho Lee

