如何在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
相关产品推荐
相关产品推荐

