Docker与GUI应用程序

TL; DR

我需要从在Docker容器的后台运行的Java应用程序启动Selenium。 启动失败是因为X11环境在运行时不可访问。 请参阅下面的Dockerfile

我该怎么办?

问题

我从一个简单的Dockerfile开始,它安装了Java 8和Jetty 9.3.x来运行一个简单的服务(实际上是Selenium的东西)。 这个服务实际上是为了启动一些需要用户界面的东西才能执行的。 我遇到的问题是执行任何内容失败,因为在我运行的configuration中没有UI。 我有一些其他的东西与supervisord运行,但这是基本的设置:

Dockerfile

 FROM ubuntu:16.04 RUN apt-get update -y && \ apt-get install -y software-properties-common wget supervisor && \ mkdir -p /var/log/supervisor && \ mkdir -p /etc/supervisor/conf.d RUN useradd -Ums /bin/bash jetty RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get update && \ apt-get install -y oracle-java8-installer && \ rm -rf /var/lib/apt/lists/* && \ rm -rf /var/cache/oracle-jdk8-installer ENV JAVA_HOME /usr/lib/jvm/java-8-oracle ENV JETTY_VERSION "9.3.7.v20160115" ENV JETTY_HOME "/opt/jetty" RUN wget -q -O /opt/jetty.tgz "http://download.eclipse.org/jetty/${JETTY_VERSION}/dist/jetty-distribution-${JETTY_VERSION}.tar.gz" && \ cd /opt && \ tar -zxvf /opt/jetty.tgz && \ rm /opt/jetty.tgz && \ mv "/opt/jetty-distribution-${JETTY_VERSION}" "${JETTY_HOME}" && \ chown -R jetty:jetty "${JETTY_HOME}" ADD supervisor.conf /etc/supervisor.conf ADD jetty.sv.conf /etc/supervisor/conf.d/jetty.sv.conf CMD ["supervisord", "-c", "/etc/supervisor.conf"] 

jetty.sv.conf

 [program:jetty] command=/usr/bin/java -jar /opt/jetty/start.jar jetty.home=/opt/jetty jetty.base=/opt/jetty redirec_stderr=true startsecs=5 

我想确保所有的东西都在UI环境中运行,而不是在无头环境下运行。

我所试过的

我尝试使用VNC和共享桌面设置,如下所示:

  • 你可以在Docker容器中运行GUI应用程序吗?
  • https://github.com/dockerfile/ubuntu-desktop
  • https://github.com/fcwu/docker-ubuntu-vnc-desktop
  • https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/
  • https://blog.docker.com/2013/07/docker-desktop-your-desktop-over-ssh-running-inside-of-a-docker-container/
  • 构build完整的Ubuntu桌面Docker镜像
  • http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

但是,这仍然不允许我的Java应用程序执行GUI应用程序。 像往常一样,我敢肯定,我在这里错过了一些简单的东西。

如何执行Jetty容器访问UI?

我们有几乎相同的情况。 竹是CI / CD工具,selenium和java8是回归testing的工具,所有这些都运行在docker集装箱内。 所以我可以说这是100%的可能性。

什么可能可以帮助你是xvbf(无头X-服务器)和x11vnc(vnc-服务器,看看容器内实际发生了什么)

 RUN set -x &&\ apt-get update &&\ apt-get install -y xvfb x11vnc &&\ apt-get clean autoremove &&\ mkdir ~/.vnc/ && x11vnc -storepasswd 111222 ~/.vnc/passwd &&\ echo "export DISPLAY=:0" >> ~/.bashrc 

如果你想,你也可以安装firefox

 RUN set -x\ && curl -O https://ftp.mozilla.org/pub/firefox/releases/47.0.1/linux-x86_64/ru/firefox-47.0.1.tar.bz2\ && tar xvjf firefox-47.0.1.tar.bz2 -C /usr/local/src\ && rm -rf firefox-47.0.1.tar.bz2\ && ln -s /usr/local/src/firefox/firefox /usr/local/bin/firefox 

还要将此命令添加到启动向导或入口点脚本

 source ~/perl5/perlbrew/etc/bashrc rm -f /tmp/.X10-lock Xvfb :0 -screen 0 1600x1200x24 & firefox -height 1200 -width 1600 & x11vnc -usepw -forever -shared & 

因此,在启动容器之后,您将能够通过任何vnc客户端连接到此容器,并在运行的情况下查看Firefox的欢迎页面,或webtesting的结果。

我们也可以直接将Docker容器连接到用户Xserver:请参阅可以在Docker容器中运行GUI应用程序的答案。