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

Ubuntu Server 22.04 LTS下Selenium与Python容器重启异常求助

解决容器重启后Python容器循环重启的问题

方案一:用Docker Compose配置依赖与健康检查

Docker Compose支持容器依赖关系和健康检查机制,能确保Python容器在Selenium Grid完全就绪后再启动,从根源避免因连接失败引发的重启循环。

编写docker-compose.yml文件

version: '3.8'

services:
  selenium-grid:
    image: selenium/hub:latest  # 替换为你实际使用的Selenium Grid镜像
    container_name: container_grid
    restart: unless-stopped
    ports:
      - "4444:4444"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4444/wd/hub/status"]
      interval: 5s
      timeout: 10s
      retries: 5
      start_period: 10s

  python-app:
    image: your-python-image:tag  # 替换为你的Python容器镜像
    container_name: container_python
    restart: unless-stopped
    depends_on:
      selenium-grid:
        condition: service_healthy
    # 按需添加环境变量或目录挂载
    # environment:
    #   - SELENIUM_HUB_URL=http://selenium-grid:4444/wd/hub
    # volumes:
    #   - ./your-scripts:/app

关键配置说明

  • healthcheck:给Selenium Grid容器添加健康检查,通过curl访问状态接口确认服务就绪。start_period设置启动后的等待时间,避免初始阶段误判服务未就绪。
  • depends_on + condition: service_healthy:让Python容器仅在Selenium Grid的健康检查通过后才启动,确保连接时服务已经可用。
  • restart: unless-stopped:保证系统重启后容器自动启动,除非手动停止。

部署命令

先删除原有两个容器,再执行:

docker-compose up -d

方案二:给Python容器添加启动延迟(无需修改代码)

如果暂时不想使用Docker Compose,可以给Python容器的启动命令添加固定延迟,等待Selenium Grid启动完成。

修改启动命令

假设原启动命令为python your_script.py,修改为:

sleep 30 && python your_script.py

应用到容器

  • 重新创建容器时指定命令:
docker run -d --name container_python --restart unless-stopped --link container_grid your-python-image:tag sleep 30 && python your_script.py
  • 针对已存在的容器,需先删除再重建(docker update无法修改启动命令):
docker stop container_python
docker rm container_python
docker run -d --name container_python --restart unless-stopped --link container_grid your-python-image:tag sleep 30 && python your_script.py

注意事项

延迟时间可根据Selenium Grid的启动速度调整,一般10-30秒足够。这种方法不如健康检查可靠,但无需额外配置文件。

方案三:在Python脚本中添加连接重试逻辑(推荐配合健康检查使用)

即使有启动顺序控制,仍可能出现临时网络波动,在脚本中添加重试逻辑能进一步提高稳定性,实现简单:

from selenium import webdriver
import time

def connect_to_selenium():
    max_retries = 10
    retry_interval = 5
    for i in range(max_retries):
        try:
            driver = webdriver.Remote(
                command_executor='http://selenium-grid:4444/wd/hub',
                options=webdriver.ChromeOptions()
            )
            print("成功连接到Selenium Grid")
            return driver
        except Exception as e:
            print(f"连接失败,第{i+1}次重试...")
            time.sleep(retry_interval)
    print("重试多次后仍无法连接,退出")
    exit(1)

# 初始化连接
driver = connect_to_selenium()

# 你的自动化逻辑
# driver.get("https://example.com")
# ...

driver.quit()

这个逻辑会在连接失败时自动重试,直到成功或达到最大重试次数,避免因单次连接失败导致容器退出重启。


内容的提问来源于stack exchange,提问作者dyedfox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:31:10