使用虚拟界面的方式,解决“xhost: unable to open display.
背景
最近在做一个项目,需求是将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
查看已创建的虚拟屏幕
ps aux | grep Xvfb
创建虚拟屏幕
Xvfb :1 -screen 0 1024x768x16 &
:1为指定的DISPLAY值
声明环境变量
export DISPLAY :1
传入docker
docker run -e DISPLAY=:1 ............
后续在docker容器中,需要使用$DISPLAY环境变量时,就会映射到虚拟屏幕上。
此方案适用于程序依赖窗口,但是窗口只是一个承载体,无业务交互,程序实际上相当于一个依赖窗户的后台服务。