Docker容器加载Google Chrome配置文件启动失败求助
问题:Docker容器中加载Chrome配置文件启动失败,报错
Could not read in devtools port number 我使用Python、Selenium和Chromedriver采集数据,通过Chrome配置文件绕过验证码,部署到Docker容器后无法加载配置文件启动Chrome,报错unknown error: Could not read in devtools port number。
我的环境配置
Dockerfile
FROM python:3.8 # Adding trusting keys to apt for repositories RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - # Adding Google Chrome to the repositories RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' # Updating apt to see and install Google Chrome RUN apt-get -y update # Magic happens RUN apt-get install -y google-chrome-stable # Installing Unzip RUN apt-get install -yqq unzip # Download the Chrome Driver 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 WORKDIR /app COPY /src/yamarket_parsing_container.py . COPY /requirements.txt . RUN pip install -r requirements.txt CMD ["python", "yamarket_parsing_container.py"]
Python代码
PATH_TO_CHROME_PROFILE = r"user-data-dir=../root/.config/google-chrome/User Data/" PROFILE_DIR_NAME = '--profile-directory=Default' def init_browser(p_profile_path, p_profile_dir_name): options = Options() options.add_argument(p_profile_path) options.add_argument(p_profile_dir_name) options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') return webdriver.Chrome(options=options) m_browser = init_browser(PATH_TO_CHROME_PROFILE, PROFILE_DIR_NAME)
运行命令
D:\Shared\parsing_yandex_market>docker run -ti -v "C:\Users\Victor\AppData\Local\Google\Chrome\User Data":/root/.config/google-chrome img
报错信息
Traceback (most recent call last): File "yamarket_parsing_container.py", line 114, in <module> main() File "yamarket_parsing_container.py", line 90, in main m_browser = init_browser(PATH_TO_CHROME_PROFILE, PROFILE_DIR_NAME) File "yamarket_parsing_container.py", line 28, in init_browser return webdriver.Chrome(options=options) File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/chrome/webdriver.py", line 80, in __init__ super().__init__( File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/chromium/webdriver.py", line 104, in __init__ super().__init__( File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 286, in __init__ self.start_session(capabilities, browser_profile) File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 378, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: Could not read in devtools port number Stacktrace: #0 0x55832cd86243 <unknown> #1 0x55832cb4a7a6 <unknown> #2 0x55832cb76ed0 <unknown> #3 0x55832cb72a51 <unknown> #4 0x55832cb6f49b <unknown> #5 0x55832cbb12a7 <unknown> #6 0x55832cbb08cf <unknown> #7 0x55832cba7e53 <unknown> #8 0x55832cb7a9ea <unknown> #9 0x55832cb7bb2e <unknown> #10 0x55832cddad5e <unknown> #11 0x55832cddea80 <unknown> #12 0x55832cdc08b0 <unknown> #13 0x55832cddfb63 <unknown> #14 0x55832cdb1f75 <unknown> #15 0x55832ce02998 <unknown> #16 0x55832ce02b27 <unknown> #17 0x55832ce1dc23 <unknown> #18 0x7f74762c1ea7 start_thread
解决方案
1. 修正配置文件路径
代码中使用的相对路径../root/.config/google-chrome/User Data/存在解析问题,替换为绝对路径,且因路径包含空格,需要用引号包裹:
PATH_TO_CHROME_PROFILE = r'user-data-dir="/root/.config/google-chrome/User Data"' PROFILE_DIR_NAME = '--profile-directory=Default'
2. 解决权限问题
Chrome默认不推荐以root用户运行,即使添加了--no-sandbox,挂载的Windows目录权限也可能不兼容。在Dockerfile中创建非root用户:
# 在Dockerfile末尾添加 RUN useradd -m seleniumuser USER seleniumuser
修改运行命令,将配置文件挂载到新用户的目录:
docker run -ti -v "C:\Users\Victor\AppData\Local\Google\Chrome\User Data":/home/seleniumuser/.config/google-chrome img
同时更新代码中的路径:
PATH_TO_CHROME_PROFILE = r'user-data-dir="/home/seleniumuser/.config/google-chrome/User Data"'
3. 避免Windows与Linux配置文件不兼容
Windows版Chrome的配置文件和Linux版存在格式差异,直接挂载可能导致启动失败。可以:
- 先在容器内启动Chrome一次,生成Linux兼容的配置目录,再将Windows配置中的关键数据(如Cookie、登录状态)迁移过去
- 或者在容器内登录目标网站,保存配置到挂载目录,后续直接复用
4. 指定DevTools端口
报错提示无法读取DevTools端口,手动指定端口参数:
def init_browser(p_profile_path, p_profile_dir_name): options = Options() options.add_argument(p_profile_path) options.add_argument(p_profile_dir_name) options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--remote-debugging-port=9222') # 新增该行 options.add_argument('--disable-gpu') # 可选,避免GPU相关问题 return webdriver.Chrome(options=options)
5. 验证Chrome与ChromeDriver版本匹配
虽然Dockerfile中拉取的是对应最新版本,但偶尔会有版本同步延迟。可以指定具体版本安装,比如:
# 替换安装Chrome的命令为指定版本 RUN apt-get install -y google-chrome-stable=114.0.5735.198-1 # 下载对应版本的ChromeDriver RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zip
内容的提问来源于stack exchange,提问作者Виктор Еремеев
相关产品推荐
相关产品推荐

