Docker depends_on顺序失效:Selenium组件启动顺序不符合预期
解决Docker Compose提前启动测试代码的问题
看起来你踩了Docker Compose并行启动的坑啦!默认情况下Compose会同时拉起所有服务,哪怕你配置了依赖,单纯的depends_on也只会等容器启动,不会等服务真正就绪(比如Selenium Hub的4444端口能正常接收请求)。这就是为什么测试代码先跑起来,而Selenium组件还没准备好的原因。
修正后的docker-compose.yml配置
version: '3' services: hub: image: selenium/hub:latest networks: - robottestsnw ports: - "4444:4444" # 健康检查:确认Hub服务真正就绪 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4444/wd/hub/status"] interval: 5s # 每5秒检查一次 timeout: 10s # 超时时间10秒 retries: 5 # 最多重试5次 chrome: image: selenium/node-chrome:latest networks: - robottestsnw # 依赖Hub的健康状态,等Hub就绪后再启动 depends_on: hub: condition: service_healthy # 配置节点连接Hub的环境变量 environment: - SE_EVENT_BUS_HOST=hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 firefox: image: selenium/node-firefox:latest networks: - robottestsnw depends_on: hub: condition: service_healthy environment: - SE_EVENT_BUS_HOST=hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 test-runner: build: ./your-test-dir # 替换成你的测试代码Dockerfile所在目录 networks: - robottestsnw # 测试服务必须等Hub就绪、浏览器节点启动后再运行 depends_on: hub: condition: service_healthy chrome: condition: service_started firefox: condition: service_started # 给测试代码传递Hub的访问地址 environment: - SELENIUM_HUB_URL=http://hub:4444/wd/hub
关键配置说明
- 健康检查(healthcheck):给Selenium Hub加上这个配置,Compose会等待Hub的
/wd/hub/status接口返回成功后,才认为Hub服务就绪,而不是仅仅容器启动。 - 带条件的depends_on:
- Chrome/Firefox节点依赖Hub的
service_healthy状态,确保节点连接Hub时Hub已经可用 - 测试服务依赖Hub的
service_healthy和节点的service_started,保证测试代码运行时,所有Selenium组件都准备完毕
- Chrome/Firefox节点依赖Hub的
- 环境变量:浏览器节点需要
SE_EVENT_BUS_*变量来正确连接到Hub,测试代码通过SELENIUM_HUB_URL访问Hub的内部网络地址
执行命令
现在再运行这个命令,就能按你期望的顺序启动服务了:
docker-compose up --build
内容的提问来源于stack exchange,提问作者atg
相关产品推荐
相关产品推荐

