【问题标题】:unknown error: DevToolsActivePort file doesn't exist when running in Docker未知错误:在 Docker 中运行时 DevToolsActivePort 文件不存在
【发布时间】:2022-01-04 08:00:25
【问题描述】:

我正在尝试在运行 alpine 的 Docker 容器中使用 Python 和 selenium 运行 chrome。它一直运行良好,直到有一天我实例化 chrome 时它开始抛出以下错误。

Message: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

代码

这是产生此错误的代码:

from selenium import webdriver


def generate_plugin():
    pluginfile = 'proxy_auth_plugin.zip'

    # manifest_json, background_js same as https://stackoverflow.com/a/61764363/9809865

    with zipfile.ZipFile(pluginfile, 'w') as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)
    return pluginfile


chrome_options = webdriver.ChromeOptions()
prefs = {"profile.default_content_setting_values.notifications": 2}
chrome_options.add_experimental_option("prefs", prefs)
plugin = generate_plugin()
chrome_options.add_extension(plugin)
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--remote-debugging-port=9222")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://google.com")

它产生的异常的完整回溯

完整的回溯

driver = webdriver.Chrome(chrome_options=chrome_options)
|   File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
|     desired_capabilities=desired_capabilities)
|   File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
|     self.start_session(capabilities, browser_profile)
|   File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
|     response = self.execute(Command.NEW_SESSION, parameters)
|   File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
|     self.error_handler.check_response(response)
|   File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
|     raise exception_class(message, screen, stacktrace)

Message: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

我使用pyvirtualdisplay 显示webdriver,但即使我在代码中添加--headless 选项,它也会引发相同的错误。

Dockerfile

这是我的 Dockerfile:

FROM python:3.6-alpine

RUN apk add xvfb

# update apk repo
RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \
    echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories

# install chromedriver
RUN apk update
RUN apk add chromium=93.0.4577.82-r2 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.15/community chromium-chromedriver=93.0.4577.82-r2
/usr/lib/chromium # ./chrome --version
Chromium 93.0.4577.82
/usr/lib/chromium # ./chromedriver --version
ChromeDriver 93.0.4577.82 (e3a25d9b9e2d0b728e045ec87c0aa4942aa46e4e-refs/branch-heads/4577@{#1237})
/usr/lib/chromium #

原始问题

我最初使用的是RUN apk add chromium=86.0.4240.111-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.13/community chromium-chromedriver=86.0.4240.111-r0

它一直运行良好,直到它开始抛出异常。所以我去了我的 docker 容器并尝试手动运行 Chrome。它抛出了这个错误

Error relocating ./chrome: hb_subset_input_set_drop_hints: symbol not found
Error relocating ./chrome: hb_subset_input_set_retain_gids: symbol not found
Error relocating ./chrome: hb_subset: symbol not found

将 Chrome 版本升级到 93.0.4577.82 后,我可以手动启动 Chrome 和 Chromedriver,但运行代码会产生相同的回溯。

操作系统和 Docker 版本

我正在使用 Macbook Pro M1 (2020) 和 MacOS 12.1

Docker 版本是最新的:4.3.2 (72729)

我尝试过的事情

我查看了 StackOverflow 和其他论坛上提出的几乎所有其他问题,但到目前为止,没有任何建议对我有用。

  • 我尝试了 alpine 上所有可用的 Chrome 和 Chromedriver 版本,从 72.0.3626.121-r0 到边缘版本

  • 我什至从 Docker 中清除了所有图像、容器和卷并重新安装了它。它也没有帮助。

更新:

传递--headless 参数使其运行。这让我假设问题与使用 pyvirtualdisplay

有关

更新 2

我错过了补充一点,我正在创建一个扩展 zip 文件以将其即时添加到 Chrome。

这是现在发生的事情:

  1. 传递参数“--headless”并禁用添加扩展,它完全可以正常工作。
  2. 传递参数“--headless”并启用添加扩展,它抛出,可以理解selenium.common.exceptions.WebDriverException: Message: Message: unknown error: failed to wait for extension background page to load: chrome-extension://ilkejjjhcpjkcecgdkkdfaocminnclpo/_generated_background_page.html
  3. 不要传递 --headless 参数并禁用扩展,它完全可以正常工作
  4. 不要传递 --headless 参数并启用扩展,它会引发与第 2 点相同的异常。

【问题讨论】:

    标签: python docker selenium selenium-webdriver alpine


    【解决方案1】:

    我在 M1 上遇到了与 official selenium docker image 相同的问题。

    但是有paragraph关于如何修复它:

    对于实验性 docker 容器镜像,它们在平台上运行,例如 作为 Mac M1 或 Raspberry Pi,请参阅社区驱动的存储库 托管在seleniumhq-community/docker-seleniarm。这些图像是 为三个独立的架构构建:linux/arm64 (aarch64), linux/arm/v7 (armhf) 和 linux/amd64。

    此外,这些实验性容器图像发布于 Seleniarm Docker Hub注册表。

    有关这些图像的更多信息,请参阅 issue #1076

    如果您使用的是 Intel 或 AMD64 架构,我们建议您使用 使用此存储库中的容器映像 (SeleniumHQ/docker-selenium) 而不是实验性的。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2019-07-12
    • 2019-08-01
    • 2019-01-22
    • 2018-11-20
    • 2022-09-30
    相关资源
    最近更新 更多