在Docker容器中使用VNCserver + GUI应用程序 + 虚拟显示器

8
我希望在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如下。仅更改了最后一行(使用ENTRYPOINT替换CMD并删除“永久”标志)
ENTRYPOINT ["/usr/bin/x11vnc", "-usepw", "-create"]

重新构建并运行容器“docker run --rm -p 5900 ”现在有了不同的行为: 容器启动,通过VNC客户端连接成功,等待几秒钟后Firefox打开(在“显示:20”上等待“扩展RANDR缺失”消息后),并且在关闭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远程访问应用程序。
2个回答

6
我找到了解决方案:
将上面的尝试 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 & - so61pi

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项目中使用它(请查看.funcs.cmds.inc.sh文件)。
此外,请参考如何使Xvfb显示可见?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接