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

