使用虚拟界面的方式,解决“xhost: unable to open display.

发布时间 2023-08-09 10:35:46作者: 木人草

背景

最近在做一个项目,需求是将windows开发的ocx控件移植到linux。该需求的解决方案想的是:在linux中部署docker,在docker中安装wine容器 ,通过wine容器启动windwos程序。

由于ocx控件依赖windows的控件,因此在使用wine命令时,需要传入$DISPLAY。

一开始,在给linux安装好GUI界面后,按照上述方案可以实现需求。需要在GUI的控制台中输入 "xhost +"命令,即可将GUI系统的界面转发至wine中。

但是随之而来的问题就是,实际部署中,不需要使用GUI界面,需要通过shell脚本的方式启动。

因此需要通过虚拟屏幕的方式解决该问题。

安装Xvfb

yum install Xvfb

我的linux系统为openEuler22.03

创建虚拟屏幕

Xvfb :1 -screen 0 1024x768x16 &

:1为指定的DISPLAY值

声明环境变量

export DISPLAY :1

传入docker

docker run -e DISPLAY=:1 ............

后续在docker容器中,需要使用$DISPLAY环境变量时,就会映射到虚拟屏幕上。

此方案适用于程序依赖窗口,但是窗口只是一个承载体,无业务交互,程序实际上相当于一个依赖窗户的后台服务。