Docker环境下使用Chromedriver运行Python脚本失败问题排查求助
解决Docker中Chromedriver执行格式错误的问题
这个OSError: [Errno 8] Exec format error: 'chromedriver'错误我之前也碰到过,核心原因要么是Chromedriver和Chromium版本不兼容,要么是驱动程序和容器架构不匹配,下面给你一步步的排查和解决思路:
问题根源分析
- 版本严重不匹配:你用的Chromedriver是2.41(2018年的旧版本,对应Chrome 67-69),但通过
apt-get install chromium安装的是Debian仓库里的最新Chromium版本,两者版本差距太大,必然导致执行失败。 - 架构不兼容:如果你的主机是ARM架构(比如M1/M2 Mac),而你下载的是x86_64架构的Chromedriver,在容器里运行就会出现执行格式错误。
解决方案1:自动匹配Chromedriver和Chromium版本
最稳妥的方式是直接用系统包管理器安装对应版本的Chromedriver,避免手动下载带来的版本问题。修改你的Dockerfile如下:
FROM python:3.9.2 RUN mkdir -p /logs # 安装依赖+Chromium+对应版本的Chromedriver RUN apt-get update && apt-get install -y --no-install-recommends \ xvfb unzip chromium chromium-driver \ && rm -rf /var/lib/apt/lists/* # 清理缓存减小镜像体积 COPY . /data WORKDIR /data RUN pip install --no-cache-dir -r requirements.txt # 环境变量设置 ENV DISPLAY=:99 ENV DOCKER_IMAGE=true
这里chromium-driver包会自动匹配系统中安装的Chromium版本,完全避免版本不兼容的问题。
解决方案2:处理ARM架构兼容性(针对M1/M2等ARM主机)
如果你的主机是ARM架构,默认的python:3.9.2镜像可能是x86_64架构,或者Debian旧版本对ARM的支持不好,可以换用更适配的基础镜像:
FROM python:3.9.2-slim-bullseye RUN mkdir -p /logs RUN apt-get update && apt-get install -y --no-install-recommends \ xvfb unzip chromium chromium-driver \ && rm -rf /var/lib/apt/lists/* COPY . /data WORKDIR /data RUN pip install --no-cache-dir -r requirements.txt ENV DISPLAY=:99 ENV DOCKER_IMAGE=true
如果需要强制指定架构构建镜像,可以执行:
# 构建x86_64架构镜像 docker build --platform linux/amd64 . # 或者构建ARM64架构镜像 docker build --platform linux/arm64 .
额外排查优化点
- 验证Chromedriver可用性:进入容器执行
/usr/bin/chromedriver --version,如果能正常输出版本号,说明驱动没问题;如果还是报错,大概率是架构问题。 - 升级Selenium版本:你的
requirements.txt里没有指定Selenium版本,旧版本Selenium可能和新Chromedriver不兼容,建议添加明确版本,比如selenium==4.15.2。 - 优化Selenium初始化代码:Selenium 4+推荐用
Service类管理驱动路径,修改你的browserSetup函数:from selenium.webdriver.chrome.service import Service def browserSetup(headless, user_agent): options = webdriver.ChromeOptions() # 你的其他配置(比如headless、user-agent)... service = Service(executable_path='/usr/bin/chromedriver') chrome_browser_obj = webdriver.Chrome(service=service, options=options) return chrome_browser_obj
内容的提问来源于stack exchange,提问作者Tommaso Ascani




