M2 Mac环境下Docker中Selenium Chrome Driver运行异常求助
问题:M2芯片MacBook上Docker容器中Chrome Driver无法运行
我基于Python和Docker开发了一个集成多网站爬取功能的API,此前在所有x64处理器设备上容器运行正常,但更换搭载M2芯片的MacBook后,Arm架构环境下出现异常。尝试通过指定平台模拟linux/amd64环境,Chrome Driver仍无法正常工作。
Docker Compose 文件
version: '3.8' networks: app-tier: driver: bridge services: db: image: mysql:8.0 container_name: UP_DB restart: always environment: MYSQL_ROOT_PASSWORD: **** MYSQL_PASSWORD: **** MYSQL_DATABASE: **** MYSQL_USER: **** command: --default-authentication-plugin=mysql_native_password --bind-address=0.0.0.0 --explicit_defaults_for_timestamp volumes: - ./sql:/docker-entrypoint-initdb.d ports: - 3306:3306 networks: - app-tier adminer: image: adminer container_name: UP_Adminer restart: always ports: - 8080:8080 networks: - app-tier api: container_name: UP_API stdin_open: true tty: true restart: always build: . ports: - 5555:5555 volumes: - ./App:/SmartUP/App networks: - app-tier scrapper: stdin_open: true tty: true container_name: UP_Scrapper image: ubuntu command: bash -c "apt-get update && apt-get install -y wget && wget http://api:5555/FetchGroupDataUPSite" volumes: - ./App:/SmartUP/App depends_on: - db - adminer - api networks: - app-tier
Dockerfile
FROM python:3.10.7-buster WORKDIR /SmartUP COPY . . ENV FLASK_ENV development ENV DEBUG true RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get install -y wget RUN apt-get update && apt-get install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' RUN apt-get -y update RUN apt-get install -y google-chrome-stable RUN apt-get install -yqq unzip RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip # Unzip the Chrome Driver into /usr/local/bin directory RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ # Set display port as an environment variable ENV DISPLAY=:99 RUN pip install --upgrade pip && pip3 install -r requirements.txt CMD ["python", "App/run.py"] # Makes the file executable EXPOSE 5555
Web Driver 配置
@dataclass class ChromeBrowser: """Class to create a Chrome browser instance""" def __init__(self): """Constructor method to initialize the Chrome browser instance""" self.chromeOptions = Options() self.chromeOptions.add_argument("--headless") # Ensure GUI is off self.chromeOptions.add_argument("--no-sandbox") self.chromeOptions.add_argument("--disable-dev-shm-usage") def buildBrowser(self) -> webdriver: """Method to build a Chrome browser instance""" webdriverService = Service(ChromeDriverManager().install()) browser = webdriver.Chrome( service=webdriverService, options=self.chromeOptions) return browser
错误信息
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.) UP_API | Stacktrace: UP_API | #0 0x004000724133 <unknown> UP_API | #1 0x004000458966 <unknown> UP_API | #2 0x00400048221a <unknown> UP_API | #3 0x00400047e07b <unknown> UP_API | #4 0x0040004bd9ad <unknown> UP_API | #5 0x0040004bd18f <unknown> UP_API | #6 0x0040004b49a3 <unknown> UP_API | #7 0x00400048946a <unknown> UP_API | #8 0x00400048a55e <unknown> UP_API | #9 0x0040006e3cae <unknown> UP_API | #10 0x0040006e78fe <unknown> UP_API | #11 0x0040006f0f20 <unknown> UP_API | #12 0x0040006e8923 <unknown> UP_API | #13 0x0040006bbc0e <unknown> UP_API | #14 0x00400070bb08 <unknown> UP_API | #15 0x00400070bc97 <unknown> UP_API | #16 0x00400071c113 <unknown> UP_API | #17 0x0040025effa3 start_thread UP_API | UP_API | #16 0x00400071c113 <unknown>
解决建议
1. 适配Arm架构的Chrome与ChromeDriver
Dockerfile中强制安装了amd64架构的Chrome,在M2的Arm环境下即使模拟amd64也容易因兼容性崩溃,修改配置适配Arm:
- 替换Chrome源为Arm架构版本:
# 注释原amd64源配置 # RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' # 添加Arm64源 RUN sh -c 'echo "deb [arch=arm64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' - 下载对应Arm架构的ChromeDriver:
# 注释原amd64驱动下载命令 # RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip # 替换为Arm64驱动 RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux_arm64.zip
2. 明确指定Docker平台架构
在Docker Compose的api服务build部分添加platform配置,确保Docker使用对应架构:
api: container_name: UP_API stdin_open: true tty: true restart: always build: context: . platform: linux/arm64 # 若坚持用amd64则改为linux/amd64,需确保Rosetta模拟正常 ports: - 5555:5555 volumes: - ./App:/SmartUP/App networks: - app-tier
若选linux/amd64,先运行docker run --platform linux/amd64 ubuntu uname -m验证模拟是否生效,输出x86_64则模拟正常。
3. 优化Chrome启动参数
在ChromeOptions中添加适配Arm环境的参数:
self.chromeOptions.add_argument("--disable-gpu") self.chromeOptions.add_argument("--single-process") self.chromeOptions.add_argument("--remote-debugging-port=9222")
--disable-gpu在无头模式下对Arm架构更友好,--single-process可避免多进程模式的兼容性问题。
4. 配置ChromeDriverManager指定架构
修改Web Driver配置,让ChromeDriverManager下载对应架构的驱动:
webdriverService = Service(ChromeDriverManager(os_type="linux_arm64").install())
需确保ChromeDriverManager版本足够新,支持自动识别或指定Arm架构。
5. 检查Docker Desktop配置
在M2 MacBook的Docker Desktop设置中,确认以下选项已勾选:
- Use the new Virtualization framework
- Enable Rosetta for x86/amd64 emulation on Apple Silicon
内容的提问来源于stack exchange,提问作者Luis Cedillo Maldonado
相关产品推荐
相关产品推荐

