【问题标题】:Using VNCserver + GUI application + Virtual Display in Docker container在 Docker 容器中使用 VNCserver + GUI 应用程序 + Virtual Display
【发布时间】:2016-07-13 06:50:04
【问题描述】:

我想在 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 在几秒钟后打开(等待消息“extension RANDR missing on display :20”),容器在关闭 vnc 连接后自动停止。

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

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

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

问题:我不知道如何将vncserver标志“-create”创建的虚拟显示添加到firefox。请让我知道在容器启动时启动 GUI 应用程序并在关闭 GUI 应用程序时自动停止容器的最佳方法。我相信dockerfile中的ENTRYPOINT应该设置为firefox。感谢您的帮助。

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

【问题讨论】:

    标签: docker dockerfile vnc xvfb


    【解决方案1】:

    我设法找到了解决方案:

    将上述尝试 3 中的脚本更改为如下工作

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

    干杯。

    【讨论】:

    • 也许我们可以运行/usr/bin/x11vnc -display :1.0 -usepw -forever &
    【解决方案2】:

    我正在使用以下 Bash 函数:

    # Configure virtual display and wine.
    # Usage: set_display
    set_display() {
      export DISPLAY=${DISPLAY:-:0} # Select screen 0 by default.
      xdpyinfo &>/dev/null && return
      if command -v x11vnc &>/dev/null; then
        ! pgrep -a x11vnc && x11vnc -bg -forever -nopw -quiet -display WAIT$DISPLAY &
      fi
      ! pgrep -a Xvfb && Xvfb $DISPLAY -screen 0 1024x768x16 &
      sleep 1
      if command -v fluxbox &>/dev/null; then
        ! pgrep -a fluxbox && fluxbox 2>/dev/null &
      fi
      echo "IP: $(hostname -I) ($(hostname))"
    }
    

    然后source 文件并调用set_display。考虑通过-usepw配置密码。

    我在下面的Docker project 中使用它(检查.funcs.cmds.inc.sh)。

    另请查看:How to make Xvfb display visible?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2013-04-24
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多