You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Виктор Еремеев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:22:54