如何在Docker容器中运行Python版Selenium?连接Hub报错如何解决?
问题核心原因及修复方案
1. 连接地址配置错误
你在app容器内使用http://localhost:4444/wd/hub访问Selenium Hub是错误的:容器内的localhost指向的是app容器自身,而非宿主机或者Selenium Hub服务所在的容器。
Docker Compose会自动为同个配置文件下的所有服务创建内部网络,你可以直接使用服务名作为域名互相访问,所以将驱动初始化代码中的连接地址修改为Hub服务的名称即可:
caps = {'browserName': os.getenv('BROWSER', 'chrome')} self.driver = webdriver.Remote(command_executor='http://hub:4444/wd/hub', desired_capabilities=caps)
2. 服务启动时序问题
depends_on只能控制容器的启动顺序,无法保证Selenium Hub服务完全初始化完成后再启动app容器。如果修改地址后仍然偶发连接报错,可以给app的启动逻辑添加等待机制:
- 方式一:在Python代码中给驱动初始化添加重试逻辑,捕获连接错误后间隔几秒再重试,最多重试3-5次
- 方式二:修改docker-compose中app的启动命令,先等待hub的4444端口通了再运行main.py,示例:
app: build: context: ./ volumes: - ./app:/app command: sh -c "wget -q --spider http://hub:4444/wd/hub/status && python main.py" depends_on: - chrome
冗余配置说明
你Dockerfile中的EXPOSE 4444是无效配置,app服务不需要监听4444端口,可以直接删除,不影响运行。
修改完成后重新执行docker-compose build && docker-compose up即可正常运行。
内容的提问来源于stack exchange,提问作者fthomson
相关产品推荐
相关产品推荐

