You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker环境下使用Chromedriver运行Python脚本失败问题排查求助

解决Docker中Chromedriver执行格式错误的问题

这个OSError: [Errno 8] Exec format error: 'chromedriver'错误我之前也碰到过,核心原因要么是Chromedriver和Chromium版本不兼容,要么是驱动程序和容器架构不匹配,下面给你一步步的排查和解决思路:

问题根源分析

  1. 版本严重不匹配:你用的Chromedriver是2.41(2018年的旧版本,对应Chrome 67-69),但通过apt-get install chromium安装的是Debian仓库里的最新Chromium版本,两者版本差距太大,必然导致执行失败。
  2. 架构不兼容:如果你的主机是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 .

额外排查优化点

  1. 验证Chromedriver可用性:进入容器执行/usr/bin/chromedriver --version,如果能正常输出版本号,说明驱动没问题;如果还是报错,大概率是架构问题。
  2. 升级Selenium版本:你的requirements.txt里没有指定Selenium版本,旧版本Selenium可能和新Chromedriver不兼容,建议添加明确版本,比如selenium==4.15.2
  3. 优化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

火山引擎 最新活动