You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm未重启异常状态Selenium Hub容器及关联问题排查

解决Docker Swarm部署Selenium Grid的三个核心问题

我结合自己部署Selenium Grid + Docker Swarm的实战经验,帮你逐个拆解并解决这三个问题:


问题1:Hub容器Unhealthy后Swarm几乎不重启

首先看你的健康检查配置,当前用curl -I http://127.0.0.1:4444/wd/hub/status只检查HTTP状态码,但Selenium Hub的/status接口即使没完全就绪也可能返回200,导致健康检查误判。另外你的restart_policy和健康检查的配合也有优化空间:

  1. 优化健康检查逻辑:改成检查接口返回的就绪状态,确保Hub真正可用:

    healthcheck:
      test: ["CMD-SHELL", "curl -s http://127.0.0.1:4444/wd/hub/status | grep -q '"ready": true'"]
      interval: 30s  # 缩短检查间隔,更快发现异常
      timeout: 10s   # 缩短超时,避免无意义等待
      retries: 3
      start_period: 120s  # Hub启动不需要5分钟,缩短启动等待期
    

    (如果镜像没有jq,用grep替代更稳妥)

  2. 调整Swarm重启策略:把restart_policy改成更激进的触发条件,确保异常时能及时重启:

    restart_policy:
      condition: any  # 无论什么原因失败都触发重启
      delay: 10s
      max_attempts: 5
      window: 120s
    

    同时检查Hub所在节点的资源是否充足,如果节点内存/CPU耗尽,Swarm可能无法正常调度重启任务。


问题2:Hub重启时所有Chrome节点自动重启

虽然你没定义显式关联,但节点容器依赖Hub的服务发现,当Hub重启时,节点会因为无法连接到Hub的旧实例,导致Selenium节点进程直接退出,进而被Swarm重启。解决思路是让节点具备重连能力,而非直接退出:

  1. 修改节点的entrypoint和环境变量:添加重连相关参数,让节点在Hub断开后自动重试注册:

    chrome:
      # 其他配置...
      environment:
        HUB_HOST: hub
        HUB_PORT: 4444
        NODE_MAX_INSTANCES: 5
        NODE_MAX_SESSION: 5
        SE_NODE_REGISTER_CYCLE: 5000  # 每5秒尝试重新注册到Hub
        SE_NODE_HEARTBEAT_PERIOD: 5000  # 缩短心跳间隔,更快感知Hub状态
      deploy:
        # 其他配置...
        restart_policy:
          condition: on-failure  # 只有节点自身故障时才重启
      entrypoint: bash -c 'SE_OPTS="-host $$HOSTNAME -registerCycle $$SE_NODE_REGISTER_CYCLE" /opt/bin/entry_point.sh'
    
  2. 给节点添加健康检查:确保节点只有在自身无法正常提供服务时才重启,而非因Hub临时不可用触发:

    healthcheck:
      test: ["CMD", "curl", "-I", "http://localhost:5555/wd/hub/status"]
      interval: 1m
      timeout: 10s
      retries: 3
      start_period: 60s
    

问题3:Inspect容器时报线程创建失败错误

这个问题大概率是容器的资源限制或内核参数不足导致的:

  1. 调整容器的ulimit参数:在Hub和Chrome节点的服务配置中添加ulimits,提升线程和文件描述符限制:

    hub:
      # 其他配置...
      ulimits:
        nproc: 65535
        nofile:
          soft: 65535
          hard: 65535
    chrome:
      # 其他配置...
      ulimits:
        nproc: 65535
        nofile:
          soft: 65535
          hard: 65535
    
  2. 检查内存限制是否合理:你的Hub内存限制是5000M,看起来足够,但如果10个Chrome节点同时向Hub注册,可能会短暂耗尽内存导致无法创建线程。可以临时调高Hub的内存限制(比如7000M)测试是否解决问题。

  3. 检查主机的/dev/shm大小:虽然你挂载了/dev/shm:/dev/shm,但如果主机的共享内存空间不足,也会导致容器内进程无法创建线程。可以用df -h /dev/shm检查主机的共享内存大小,必要时通过mount -o remount,size=16G /dev/shm临时调整,或者在fstab中永久配置。


内容的提问来源于stack exchange,提问作者user1935987

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:22:33