WSL2环境下Docker Compose中Python与Selenium无法通信求助
WSL2环境下Docker Compose的Python-Selenium连接问题排查
问题背景
搭建了一套用于Python-Selenium测试的Docker Compose环境,在Linux服务器上运行正常,但在WSL2环境中运行时,Python容器无法连接到Selenium容器。
现有配置
Docker Compose配置
version: "3.9" services: selenium: image: "selenium/standalone-firefox:4.5.2-20221021" ports: - "4444:4444" - "7900:7900" shm_size: '2gb' container_name: selenium python: build: "python" container_name: python_tests depends_on: - "selenium"
Python的Dockerfile
FROM python:3.10 COPY selenium_tests.py ./ COPY requirements.txt ./ ENV NO_PROXY = selenium:4444 RUN ["python3.10", "-m", "pip", "install", "-r", "requirements.txt"] CMD ["python3.10", "selenium_tests.py"]
Python测试代码片段
print("sleeping so selenium wakes") sleep(10) driver = webdriver.Remote(command_executor='http://selenium:4444/wd/hub', options=webdriver.FirefoxOptions())
排查关键点
1. 修复NO_PROXY环境变量语法错误
Dockerfile中ENV NO_PROXY = selenium:4444的写法存在问题,等号前后的空格会导致变量值包含无效空格,正确写法应为:
ENV NO_PROXY=selenium:4444
错误的变量值会导致代理规则失效,可能让请求被错误转发。
2. 替换sleep为容器健康检查
depends_on仅能保证Selenium容器启动,但不代表Selenium服务已就绪。用健康检查替代硬编码的sleep更可靠:
修改Docker Compose配置:
services: selenium: # 原有配置... healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4444/wd/hub/status"] interval: 5s timeout: 10s retries: 5 python: # 原有配置... depends_on: selenium: condition: service_healthy
这样Python容器会等待Selenium服务真正就绪后再启动测试。
3. 验证容器间网络连通性
进入Python容器,执行以下命令排查网络问题:
# 进入容器 docker exec -it python_tests bash # 检查是否能解析selenium服务 ping selenium # 检查Selenium服务状态 curl http://selenium:4444/wd/hub/status
如果ping不通,说明WSL2的Docker内部DNS解析存在问题;如果curl返回错误,说明Selenium服务未正常启动。
4. 检查Selenium端点路径
Selenium 4部分版本可能调整了端点路径,可尝试将命令执行器地址改为http://selenium:4444:
driver = webdriver.Remote(command_executor='http://selenium:4444', options=webdriver.FirefoxOptions())
5. WSL2特定网络检查
- 确认WSL2版本为最新,执行
wsl --update进行更新。 - 检查Windows防火墙是否允许Docker相关网络请求,可临时关闭防火墙测试。
- 验证WSL2的网络模式,Docker在WSL2中默认使用WSL网络栈,若有自定义网络配置,需确保内部容器网络未被阻断。
内容的提问来源于stack exchange,提问作者Akseli Arvaja
相关产品推荐
相关产品推荐

