基于GUI的环境的Docker?

 灿烂的胖羊羊 发布于 2023-01-11 10:58

问题

我有一组客户机,它们是企业Web应用程序的一部分.每台机器运行相同的软件,这是一个连接到服务器的基于PyQT的Web客户端.这个客户端软件定期更新,我希望有一些配置/配置工具,允许在每台机器上拥有相同的环境,从而在每个客户机器上轻松部署和配置软件.

问题是我尝试使用Chef,但实际维护Chef知识和技能需要付出很多努力(我们没有专门的Ops人),而且如果某个第三方存储库不再存在,则Chef配方可能会失败可用(这是一个主要的塞子).

我想尝试使用Docker解决问题,但我仍然不知道是否可以设置允许某些基于GUI的软件运行的图像/容器.

是否可以使用Docker为基于GUI的应用程序(PyQt/QT)提供开发/生产环境?如果是的话,接下来的第一步是什么?

2 个回答
  • 有许多解决方案可以在docker容器中运行GUI应用程序.例如,您可以使用SSH或VNC.但他们增加了一些开销和延迟.我找到的最好的方法就是将主机中X服务器使用的文件作为卷传递给容器.像这样:

    docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY TheImage
    

    然后,所有GUI应用程序都将从容器运行.

    希望这可以帮助!

    2023-01-11 11:01 回答
  • 目前这个问题没有得到解答,但在Google上排名很高.其他答案大多是正确的,但有一些警告,我已经学到了很多困难,我想拯救别人的麻烦.

    Nasser Alshammari给出的答案是在Docker容器中运行GTK应用程序的最简单(也是最快)的方法 - 只需将X服务器的套接字挂载为Docker卷,并告诉Docker使用它.

    docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY TheImage
    

    (我还建议传递-u <username-within-container>标志,因为以root身份运行X11应用程序并不总是有效,通常不建议使用,特别是在共享会话时).

    这适用于诸如xterm基于GTK的应用程序之类的应用程序.例如,如果您使用Firefox(基于GTK)尝试此操作,它将起作用(请注意,如果您已经在主机上运行Firefox,它将在主机中打开一个新窗口而不是打开一个新的Firefox实例从容器内).

    但是,您的答案特别询问了PyQT.事实证明,Qt不支持以这种方式共享X会话(或者至少不支持它).

    如果您尝试以这种方式运行基于QT的应用程序,您可能会收到如下错误:

    X Error: BadAccess (attempt to access private resource denied) 10
      Extension:    140 (MIT-SHM)
      Minor opcode: 1 (X_ShmAttach)
      Resource id:  0x12d
    X Error: BadShmSeg (invalid shared segment parameter) 148
      Extension:    140 (MIT-SHM)
      Minor opcode: 5 (X_ShmCreatePixmap)
      Resource id:  0xb1
    X Error: BadDrawable (invalid Pixmap or Window parameter) 9
      Major opcode: 62 (X_CopyArea)
      Resource id:  0x2c0000d
    X Error: BadDrawable (invalid Pixmap or Window parameter) 9
      Major opcode: 62 (X_CopyArea)
      Resource id:  0x2c0000d
    

    我说"可能"是因为我没有用足够的Qt应用程序来测试这种方法,或者深入研究Qt源代码,足以弄清楚为什么不支持它.YMMV,你可能会很幸运,但如果你想在Docker容器中运行一个基于Qt的应用程序,你可能不得不采用"老式"方法,要么

      在容器中运行sshd,打开X11转发,然后使用ssh -X(更安全)或ssh -Y(安全性较低,在完全信任容器化应用程序时使用)连接到容器.

      在容器中运行VNC,并使用VNC客户端从主机连接到VNC.

    在这两个选项之间,我会推荐第一个,但看看哪个最适合你的情况.

    2023-01-11 11:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有