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

如何在Docker中运行Flask+Selenium?启动报错求助

在Docker中运行Flask+Selenium时ChromeDriver启动失败(错误码255)

问题描述

本地Mac Mini M1上可正常运行的Flask+Selenium代码,打包成Docker镜像后启动报错,ChromeDriver意外退出,状态码255。

报错信息

[2022-12-16 11:30:05 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2022-12-16 11:30:05 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[2022-12-16 11:30:05 +0000] [1] [INFO] Using worker: sync
[2022-12-16 11:30:05 +0000] [6] [INFO] Booting worker with pid: 6
[WDM] - Downloading: 100%|██████████| 6.96M/6.96M [00:00<00:00, 12.6MB/s]
[2022-12-16 11:30:07 +0000] [6] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 134, in init_process
    self.load_wsgi()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
    return self.load_wsgiapp()
  File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python3.10/site-packages/gunicorn/util.py", line 359, in import_app
    mod = importlib.import_module(module)
  File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/app.py", line 2, in <module>
    from scrapeutil import get_db
  File "/scrapeutil.py", line 14, in <module>
    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_options)
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/chrome/webdriver.py", line 69, in __init__
    super().__init__(DesiredCapabilities.CHROME['browserName'], "goog",
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/chromium/webdriver.py", line 89, in __init__
    self.service.start()
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/common/service.py", line 98, in start
    self.assert_process_still_running()
  File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/common/service.py", line 110, in assert_process_still_running
    raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: Service /root/.wdm/drivers/chromedriver/linux64/108.0.5359/chromedriver unexpectedly exited. Status code was: 255

已完成的排查

  • 制作仅包含gunicorn和返回"Hello World"的Flask端点的Docker镜像,运行正常,确认问题出在webdriver部分。

触发报错的代码

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_options)

当前配置

Dockerfile

# Do not use Alpine Linux if you use pandas
# FROM python:3.10-alpine3.16
# bullseye https://wiki.debian.org/DebianReleases
FROM python:3.10-bullseye
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . /
# {module_import}:{app_variable}
# equivalent to 'from app import app'
CMD ["gunicorn", "-b", ":8080", "app:app"]

requirements.txt

flask==2.2.*
pandas==1.5.*
selenium==4.5.*
webdriver-manager==3.8.*
gunicorn==20.1.*

解决方案

错误码255的核心原因是:Docker容器中缺少Chrome浏览器运行所需的依赖库,且无头模式参数不全,导致ChromeDriver无法正常启动。

1. 修改Dockerfile,安装Chrome及依赖

python:3.10-bullseye基础镜像未预装Chrome浏览器,需要手动安装。更新后的Dockerfile如下:

FROM python:3.10-bullseye

# 安装Chrome浏览器及运行依赖
RUN apt-get update && apt-get install -y \
    wget \
    gnupg2 \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \
    && apt-get update && apt-get install -y \
    google-chrome-stable \
    fonts-liberation \
    libasound2 \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libatspi2.0-0 \
    libcups2 \
    libdbus-1-3 \
    libdrm2 \
    libgbm1 \
    libgtk-3-0 \
    libnspr4 \
    libnss3 \
    libx11-xcb1 \
    libxcb-dri3-0 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxfixes3 \
    libxi6 \
    libxrandr2 \
    libxrender1 \
    libxss1 \
    libxtst6 \
    xdg-utils \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . /

CMD ["gunicorn", "-b", ":8080", "app:app"]

2. 补充ChromeOptions的必要参数

容器环境下无头模式需要添加更多参数以避免兼容性问题,修改后的代码:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless=new")  # 使用新版无头模式,兼容性更好
chrome_options.add_argument("--no-sandbox")    # 禁用沙箱模式,容器环境必备
chrome_options.add_argument("--disable-dev-shm-usage")  # 避免/dev/shm空间不足
chrome_options.add_argument("--disable-gpu")   # 禁用GPU加速,无头模式不需要
chrome_options.add_argument("--window-size=1920,1080")  # 设置窗口尺寸,避免页面布局异常

# 可选:指定Chrome二进制文件路径,确保webdriver能找到Chrome
chrome_options.binary_location = "/usr/bin/google-chrome-stable"

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_options)

3. 验证

重新构建Docker镜像并运行,ChromeDriver应该能正常启动,Flask服务可正常调用Selenium功能。


内容的提问来源于stack exchange,提问作者Jason Rich Darmawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:45:33