Docker Swarm未重启异常状态Selenium Hub容器及关联问题排查
我结合自己部署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和健康检查的配合也有优化空间:
优化健康检查逻辑:改成检查接口返回的就绪状态,确保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替代更稳妥)调整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重启。解决思路是让节点具备重连能力,而非直接退出:
修改节点的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'给节点添加健康检查:确保节点只有在自身无法正常提供服务时才重启,而非因Hub临时不可用触发:
healthcheck: test: ["CMD", "curl", "-I", "http://localhost:5555/wd/hub/status"] interval: 1m timeout: 10s retries: 3 start_period: 60s
问题3:Inspect容器时报线程创建失败错误
这个问题大概率是容器的资源限制或内核参数不足导致的:
调整容器的ulimit参数:在Hub和Chrome节点的服务配置中添加ulimits,提升线程和文件描述符限制:
hub: # 其他配置... ulimits: nproc: 65535 nofile: soft: 65535 hard: 65535 chrome: # 其他配置... ulimits: nproc: 65535 nofile: soft: 65535 hard: 65535检查内存限制是否合理:你的Hub内存限制是5000M,看起来足够,但如果10个Chrome节点同时向Hub注册,可能会短暂耗尽内存导致无法创建线程。可以临时调高Hub的内存限制(比如7000M)测试是否解决问题。
检查主机的/dev/shm大小:虽然你挂载了
/dev/shm:/dev/shm,但如果主机的共享内存空间不足,也会导致容器内进程无法创建线程。可以用df -h /dev/shm检查主机的共享内存大小,必要时通过mount -o remount,size=16G /dev/shm临时调整,或者在fstab中永久配置。
内容的提问来源于stack exchange,提问作者user1935987

