在Azure容器实例中部署带录屏功能的Docker-Selenium Grid 4时遭遇无法打开显示的错误
我来帮你解决这个录屏容器无法连接到Selenium Node的问题。从错误日志来看,核心问题是视频容器无法访问到目标容器的X11显示端口(:99.0)——默认情况下Selenium Node容器的Xvfb仅监听本地Unix Socket,而Azure容器实例中不同容器之间默认不共享这个Socket,导致连接失败。
下面是两种可行的解决方案,推荐优先使用第一种:
解决方案1:共享X11 Unix Socket(推荐)
通过添加共享卷挂载/tmp/.X11-unix目录,让视频容器直接访问Node容器的X11 Socket,这是最可靠的方式。
修改你的容器定义文件,做以下调整:
- 在
volumes部分新增一个用于共享X11 Socket的emptyDir卷 - 给Chrome Node容器和视频容器都挂载这个卷
- 视频容器直接设置
DISPLAY环境变量为:99,无需依赖DISPLAY_CONTAINER_NAME
完整修改后的容器定义示例:
apiVersion: 2019-12-01 location: germanywestcentral name: nameforcontainergroup2 properties: containers: - name: selenium-hub properties: image: selenium/hub:4.1.1-20211217 resources: requests: cpu: 1 memoryInGb: 1 ports: - port: 4444 - name: chrome-node properties: image: selenium/node-chrome:4.1.1-20211217 resources: requests: cpu: 1 memoryInGb: 2 environmentVariables: - name: SE_EVENT_BUS_HOST value: selenium-hub # 修正:之前设为localhost错误,改为Hub容器名称 - name: SE_EVENT_BUS_PUBLISH_PORT value: 4442 - name: SE_EVENT_BUS_SUBSCRIBE_PORT value: 4443 - name: SE_NODE_PORT value: 5560 - name: VNC_NO_PASSWORD value: 1 - name: DISPLAY value: ":99" # 明确指定DISPLAY端口 volumeMounts: - name: devshm mountPath: /dev/shm - name: downloads mountPath: /home/seluser/downloads - name: x11-socket mountPath: /tmp/.X11-unix - name: chrome-node-1-video properties: image: selenium/video:ffmpeg-4.3.1-20211217 resources: requests: cpu: 1 memoryInGb: 2 environmentVariables: - name: DISPLAY value: ":99" # 直接使用共享的Socket - name: FILE_NAME value: chrome-node_video.mp4 volumeMounts: - name: videos mountPath: /videos - name: x11-socket mountPath: /tmp/.X11-unix osType: Linux volumes: - name: devshm emptyDir: {} - name: downloads emptyDir: {} - name: videos emptyDir: {} - name: x11-socket # 新增:共享X11 Socket的卷 emptyDir: {} ipAddress: ports: - protocol: tcp port: '4444' type: Public dnsNameLabel: some-dns-label tags: null type: Microsoft.ContainerInstance/containerGroups
解决方案2:配置Xvfb监听TCP端口
如果不想共享Socket,可以修改Node容器的Xvfb参数,让它监听TCP端口,允许视频容器远程连接:
- 在Chrome Node容器中添加环境变量,修改Xvfb的启动参数:
- name: XVFB_ARGS value: "-screen 0 1920x1080x24 -ac -nolisten unix -listen tcp" - name: DISPLAY value: ":99"
这个参数会让Xvfb放弃监听Unix Socket,转而监听TCP端口6099(对应DISPLAY :99,端口号为6000+99)。
- 保持视频容器的
DISPLAY_CONTAINER_NAME为chrome-node即可,视频容器会自动解析容器名称到IP并连接对应端口。
额外注意事项
- 修正了
SE_EVENT_BUS_HOST的值:之前设为localhost是错误的,Hub是独立容器,必须设置为Hub的容器名称selenium-hub,Node才能正确注册到Hub。 - 资源配置:Chrome和Xvfb需要足够的资源,你设置的1CPU/2GB是合理的,如果部署多个Node,需要相应调整资源配额。
- 视频持久化:当前
videos卷是emptyDir,容器重启后视频会丢失,如果需要持久化,可以改为Azure文件共享卷。
内容的提问来源于stack exchange,提问作者Kamil Marek
相关产品推荐
相关产品推荐

