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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:22:04