在 Docker 容器中使用 VNCserver + GUI 应用程序 + Virtual Display

2023-11-22

我想在 docker 容器内运行 firefox (或任何图形应用程序)。

我的要求:当我启动容器时,我应该创建一个虚拟显示,启动 VNC 服务器,然后启动 GUI 应用程序。这意味着容器成功启动后,我可以通过 VNC 客户端连接到容器内运行的 GUI 应用程序。当我关闭应用程序时,容器应该自动停止。

尝试1:我从这里的例子开始https://hub.docker.com/r/devopsil/vnc-firefox/~/dockerfile/在此示例中,开发人员通过 CMD 启动 vnc 服务器并使其永远运行。他将 firefox 作为 .rc 文件的一部分,以便它在容器启动时启动。如果您通过 VNC 客户端连接,您可以看到 Firefox,并且按预期关闭 Firefox 或断开 VNC 会话不会停止容器。

尝试2:我按如下方式调整了 Dockerfile。仅更改了最后一行(将 CMD 替换为 ENTRYPOINT 并删除了“永远”标志”)

ENTRYPOINT ["/usr/bin/x11vnc", "-usepw", "-create"]

重建并运行容器“docker run --rm -p 5900”现在有不同的行为: 容器启动,通过 VNC 客户端的连接工作,几秒钟后打开 Firefox(在消息“显示扩展名 RANDR 丢失:20”后等待),并且容器在关闭 VNC 连接后自动停止。

尝试3:然后我创建了一个 bash 脚本来启动 vncserver 和 firefox,并更改了 Dockerfile 以将此脚本文件复制到映像中,并将该脚本作为入口点。但我收到类似于“显示变量未设置”的错误

#!/bin/bash
/usr/bin/x11vnc -forever -usepw -create &
firefox

尝试4:所以我通过 docker run 命令传递了 DISPLAY 变量,但错误是无法打开显示。

Question: 我不知道如何像firefox上的vncserver标志“-create”创建的虚拟显示一样。请让我知道在容器启动时启动 GUI 应用程序并在 GUI 应用程序关闭时自动停止容器的最佳方式是什么。我相信 dockerfile 中的 ENTRYPOINT 应该设置为 firefox。感谢您的帮助。

我见过这个https://blog.jessfraz.com/post/docker-containers-on-the-desktop/但这对我来说没有用,因为我想通过 VNC 远程访问该应用程序。


我设法找到了解决方案:

更改了脚本尝试3以上如下工作

!/bin/bash

Xvfb :1 -screen 0 800x600x16 &
/usr/bin/x11vnc -display :1.0 -usepw &
DISPLAY=:1.0
export DISPLAY
firefox

Cheers.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Docker 容器中使用 VNCserver + GUI 应用程序 + Virtual Display 的相关文章

随机推荐

  • .NET Web API 2 OWIN Bearer Token Authentication 直接调用

    我的 Web Api 项目有问题 我的数据库中存储了文件 并希望在新窗口中直接调用它们来查看 保存 URL 如 api Files 5 5 是 FileId 我使用 Bearer Token 来处理我的一般 AJAX 请求 使用 Angul
  • 如何否定正则表达式中的特定单词? [复制]

    这个问题在这里已经有答案了 我知道我可以否定字符组 如 bar 但我需要一个正则表达式 其中否定适用于特定单词 所以在我的示例中如何否定实际的bar 而不是 酒吧中的任何字符 一个很好的方法是使用负前瞻 bar 负向先行结构是一对括号 左括
  • Mongoose/mongoDB 查询连接..但我来自 sql 背景

    我来自 sql 背景 所以在连接表的 sql 中编写查询非常简单 但我想我在 mongoose mongodb 中缺少它 基本上我知道 Subscriber ID 它映射到用户集合中的文档 我想拉出项目组 以及用户所属的所有项目 所以如果我
  • WPF 使用 ResizeGrip 调整控件大小

    我希望用户可以通过拖动右下边框上的调整大小夹点来调整控件的大小 随着ResizeGrip似乎存在实现此目的的完美控制 但我不知道使用此控制的计划是什么 它并非源自 Thumb 但是在msdn被写为它是它的 实现 并且也不支持以下的路由事件T
  • 如何在 Android TabLayout 中设置选项卡的高度?

    我在 Android 中有这个 TabLayout 并且想让选项卡比默认值 48dp 高一点
  • 如何从数组中删除一定范围的值?

    If array 1 2 3 4 5 6 7 8 9 我想从数组中删除一系列元素 例如 我想删除索引在范围内的所有元素2 5从该数组中 结果应该是 1 2 7 8 9 提前致谢 Use slice 删除由 范围给出的元素 array 1 2
  • 在日历应用程序中使用特定事件 ID 打开“事件详细信息”

    我正在尝试打开包含特定事件的日历 我已以编程方式添加了事件 并且这些事件的所有 ID 都是持久的 这就是我添加事件的方式 IBAction addEvent id sender EKEventStore store EKEventStore
  • 哪个 Facebook SDK 与 PHP 5.3 一起使用?

    不幸的是我已经走进了一个死胡同 由于各种遗留问题和其他原因 我无法将系统升级到 PHP 5 4 和根据脸书 我需要5 4才能运行最新的SDK 我愿意接受较低的 SDK 但是 如果我使用旧版 SDK 可以吗 我应该使用哪个 SDK 奖金问题
  • 分层实体的接口设计

    我必须为分层实体设计一个接口 interface HierarchicalEntity
  • 最小距离哈密顿路径Javascript

    我知道这是一个相当常见的问题 一般而言 但我已经被它难住了一段时间了 我正在寻找给定一组 x y 坐标的最小距离哈密顿路径 起点和终点完全是任意的 但它不能循环 所以标准 tsp 已经消失 尽管据说在与所有其他节点的距离为 0 处添加一个虚
  • 使用 iOS 8 在 iPad 上正确呈现 UIAlertController

    苹果在 iOS 8 0 中引入了UI警报控制器取代UI操作表 不幸的是 苹果没有添加任何有关如何呈现它的信息 我找到了一个entryhayaGeek 的博客上有关于它的信息 但是它似乎不适用于 iPad 这个观点完全错位了 Misplace
  • CodeIgniter 3 和会话

    我最近按照本指南更新到 CodeIgniter 3 CI3 从2 2 1升级3 0 我在 application config config php 文件中设置了此配置 config sess driver files config ses
  • 在 Java DOM 中创建命名空间前缀的 XML 节点

    我正在通过 Java 创建几个 XML 文件 到目前为止一切都工作正常 但现在我在尝试创建带有命名空间前缀节点的文件时遇到了问题 即类似的内容
  • 导入 Visual Studio TFS 工作区

    有没有办法导入 Visual Studio TFS 工作区 我有 30 多个工作区 我需要将它们导入到新计算机上的 TFS 谢谢 如果你想克隆结构的工作空间 但不要管旧的 运行 tf workspace server yourserver
  • 如何使用 NodeJS 以超级用户身份连接到另一个 MongoDB 数据库?

    解决方案为这个问题工作正常 而不是做 mongo my db name u superuser p 1234 I do mongo admin u superuser p 1234 connecting as super user to a
  • 如何运行包中的 Java 类?

    我有两个java类如下 App1不带包装 class App1 public static void main String args System out println App1 hello world App2在一个包中 packag
  • 如何从子 Widget 更新父 Widget 的状态,同时更新 Flutter 中子 Widget 的状态?

    我想请你帮忙解决这个问题 我下面的示例代码旨在从子窗口小部件更新父窗口小部件的状态 同时也更新子窗口小部件的状态 父窗口小部件的文本值将更新 同时也会更改子窗口小部件按钮的颜色 import package flutter material
  • 在Java中如何确保当前本地时间是正确的? [复制]

    这个问题在这里已经有答案了 我需要确保在我的客户端应用程序中 用户不会显着更改机器日期 例如 将其更改为 1 个月前 据我所知 在 Java 中检查当前时间的最佳方法是 System currentTimeInMillis 在多平台环境 W
  • 如何使用Python + Webdriver进行远程连接

    我正在尝试弄清楚如何连接到我的远程网络驱动程序实例 这是我当前使用的代码 from selenium remote webdriver import WebDriver driver WebDriver http 172 16 205 12
  • 在 Docker 容器中使用 VNCserver + GUI 应用程序 + Virtual Display

    我想在 docker 容器内运行 firefox 或任何图形应用程序 我的要求 当我启动容器时 我应该创建一个虚拟显示 启动 VNC 服务器 然后启动 GUI 应用程序 这意味着容器成功启动后 我可以通过 VNC 客户端连接到容器内运行的