如何在Dockerfile中修复ChromeDriver与Google Chrome版本不兼容问题
问题背景
作为Docker新手,构建包含Google Chrome和ChromeDriver的项目镜像时,出现版本不兼容报错:ChromeDriver版本114仅支持Chrome 114,但实际安装的Chrome版本为116.0.5845.110,且原Dockerfile使用的chromedriver.storage.googleapis.com已不再受支持。
原Dockerfile相关代码:
# install google chrome 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 # install chromedriver 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 RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
报错信息:
selenium.common.exceptions.SessionNotCreatedException: Message:
session not created: This version of ChromeDriver only supports Chrome
version 114 Current browser version is 116.0.5845.110 with binary path
/opt/google/chrome/google-chrome Stacktrace:
#0 0x56061f6b04e3
#1 0x56061f3dfc76
#2 0x56061f40d04a
#3 0x56061f4084a1
#4 0x56061f405029
#5 0x56061f443ccc
#6 0x56061f44347f
#7 0x56061f43ade3
#8 0x56061f4102dd
#9 0x56061f41134e
#10 0x56061f6703e4
#11 0x56061f6743d7
#12 0x56061f67eb20
#13 0x56061f675023
#14 0x56061f6431aa
#15 0x56061f6996b8
#16 0x56061f699847
#17 0x56061f6a9243
#18 0x7f72cb9de044
解决方法
修改Dockerfile,先安装Chrome并提取其主版本号,再下载对应版本的ChromeDriver(使用官方最新的Chrome for Testing下载源),确保版本完全兼容:
# 安装Google Chrome 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 update && apt-get install -y google-chrome-stable # 提取Chrome的主版本号(例如从116.0.5845.110提取116.0.5845) RUN CHROME_VERSION=$(google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+' | cut -d. -f1-3) # 安装对应版本的ChromeDriver(使用官方Chrome for Testing下载源) RUN apt-get install -yqq unzip RUN wget -O /tmp/chromedriver.zip "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$CHROME_VERSION/linux64/chromedriver-linux64.zip" RUN unzip /tmp/chromedriver.zip chromedriver-linux64/chromedriver -d /tmp/ RUN mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/ RUN chmod +x /usr/local/bin/chromedriver
代码优化(可选)
如果项目使用Selenium 4.6及以上版本,可以借助Selenium的自动Driver管理功能,无需手动指定ChromeDriver路径,进一步简化代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # Selenium 4.6+ 自动适配ChromeDriver,无需手动指定路径 driver = webdriver.Chrome(service=Service(), options=options)
说明
- 原
chromedriver.storage.googleapis.com已被废弃,官方推荐使用Chrome for Testing的下载源,确保获取到与Chrome版本完全匹配的ChromeDriver。 - 通过提取已安装Chrome的版本号来下载对应ChromeDriver,可避免版本不一致问题,保证每次构建镜像时两者版本同步。
内容的提问来源于stack exchange,提问作者Mejdi Dallel

