Docker部署Selenium脚本时selenium-hub域名解析失败如何解决
问题原因
核心原因是你配置的app服务启用了network_mode: "host":
- Docker Compose默认会为当前项目的所有服务创建独立的内部桥接网络,只有在该网络内的服务才能通过服务名(如
selenium-hub)完成DNS解析互通 - 给
app设置主机网络模式后,它会直接使用宿主机的网络栈,脱离了Compose创建的默认内部网络,因此无法解析selenium-hub这个内部服务域名,触发名称解析失败报错。
另外你的配置还存在两个非直接导致本次报错,但需要修正的问题:
volumes配置存在语法错误:- . :/home/saimon/中本地路径和冒号之间多余了空格,会导致挂载失败depends_on仅控制服务启动顺序,不会等待selenium-hub完全初始化就绪就会启动app,如果启动时机过快也可能偶发连接失败。
解决方案
根据你的需求选择对应方案即可:
方案1(推荐):移除主机网络配置
直接删除app服务下的network_mode: "host"配置,让app回归Compose默认内部网络,即可正常解析selenium-hub服务名。
修正后的完整docker-compose.yml参考:
version: "3" services: chrome: image: selenium/node-chrome:4.0.0-rc-1-prerelease-20210823 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 ports: - "6900:5900" selenium-hub: image: selenium/hub:4.0.0-rc-1-prerelease-20210823 container_name: selenium-hub ports: - "4444:4444" app: build: context: . volumes: - .:/home/saimon/ depends_on: - selenium-hub - chrome command: python3 app.py environment: - SELENIUM_REMOTE_HOST=selenium-hub
修改完成后重新执行docker-compose up即可正常运行。
方案2:保留主机网络修改连接地址
如果你确实需要app使用宿主机网络,则不能用内部服务名连接selenium-hub,需要修改Selenium驱动初始化的连接地址为宿主机地址:
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME, options=self.chrome_options)
因为selenium-hub已经将4444端口映射到宿主机,直接通过本地回环地址即可访问。
可选优化
为了避免selenium-hub未就绪就启动app导致偶发连接失败,可以在启动命令中增加等待逻辑,示例:
command: sh -c "sleep 15 && python3 app.py"
内容的提问来源于stack exchange,提问作者Saimon
相关产品推荐
相关产品推荐

