M1芯片Mac下Docker安装Google Chrome报错及Selenium部署方法
报错核心原因
- 源配置中硬编码了
[arch=amd64],M1芯片Mac的Docker默认运行arm64架构镜像,apt只会检索当前架构的软件包,无法找到amd64架构的chrome安装包 - 旧版
apt-key add添加密钥的方式已经在新版Debian/Ubuntu中被废弃,容易触发密钥校验类错误 - 没有提前安装Chrome运行依赖的系统库,就算找到安装包也会出现依赖缺失的安装失败问题
适配M1(arm64)的Chrome安装方案
优先使用原生arm64架构的Chrome,性能远高于QEMU模拟的amd64版本,Dockerfile配置片段如下:
# 先安装Chrome运行所需的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ wget gnupg2 ca-certificates fonts-liberation \ libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 \ libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 \ libgtk-3-0 libnspr4 libnss3 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 lsb-release xdg-utils \ && rm -rf /var/lib/apt/lists/* # 自动适配架构添加Chrome官方源 RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /usr/share/keyrings/google-chrome-keyring.gpg RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list # 安装Chrome稳定版 RUN apt-get update && apt-get install -y google-chrome-stable \ && rm -rf /var/lib/apt/lists/*
如果必须使用amd64版本Chrome,构建镜像时添加--platform linux/amd64参数即可,例如docker build --platform linux/amd64 -t selenium-chrome .,该方案依赖QEMU转译,运行性能较差,非必要不使用。
Docker中运行Selenium的完整配置
以下是基于Python环境的可直接运行的Dockerfile示例,Selenium 4.6+版本内置了Selenium Manager,会自动匹配Chrome版本下载对应ChromeDriver,无需手动安装配置:
# 自动适配构建主机架构,M1下默认使用arm64镜像 FROM --platform=$BUILDPLATFORM python:3.11-slim-bookworm WORKDIR /app # 安装Chrome及依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ wget gnupg2 ca-certificates fonts-liberation \ libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 \ libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 \ libgtk-3-0 libnspr4 libnss3 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 lsb-release xdg-utils \ && rm -rf /var/lib/apt/lists/* RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /usr/share/keyrings/google-chrome-keyring.gpg RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list RUN apt-get update && apt-get install -y google-chrome-stable \ && rm -rf /var/lib/apt/lists/* # 安装Selenium RUN pip install --no-cache-dir selenium # 复制本地项目代码到容器 COPY . . # 替换为你实际的启动命令 CMD ["python", "main.py"]
Selenium脚本中需要添加容器环境必需的Chrome启动参数,示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options opts = Options() # 无头模式,无GUI环境必需 opts.add_argument("--headless=new") # 关闭沙箱,容器环境运行必需 opts.add_argument("--no-sandbox") # 禁用/dev/shm共享内存,避免容器内存不足报错 opts.add_argument("--disable-dev-shm-usage") opts.add_argument("--disable-gpu") opts.add_argument("--window-size=1920,1080") driver = webdriver.Chrome(options=opts) driver.get("https://example.com") print(driver.title) driver.quit()
注意事项
- 不要硬编码软件源的CPU架构,通过
$(dpkg --print-architecture)自动获取,可同时兼容arm64、amd64架构 - 安装完成后及时清理
/var/lib/apt/lists/*缓存,可以有效减小镜像体积 - 如果使用其他语言的Selenium绑定(Java/Node.js/Go等),Chrome安装部分的配置完全通用,只需要替换对应语言的基础镜像和依赖安装命令即可
内容的提问来源于stack exchange,提问作者user19258402
相关产品推荐
相关产品推荐

